Riferimento Istruzioni 680x0¶
La famiglia Motorola 68000 fu progettata per una forte compatibilità object-code verso l'alto, ma la compatibilità non è assoluta. Esempi includono il cambio di privilegio in MOVE from SR sul MC68010, la rimozione di CALLM/RTM dopo il MC68020, i cambiamenti nel modello di programmazione MMU, e le istruzioni del MC68060 che richiedono supporto software guidato dalle eccezioni. Questo articolo è la matrice di riferimento principale che incrocia ogni istruzione 680x0 contro ciascuna generazione di CPU. Usala per determinare quale opcode è disponibile su quale target quando si scrive assembly per la famiglia Amiga (A500/A1000 = 68000; A1200 = 68020; A3000/A4000 = 68030/68040).
Questo articolo è popolato progressivamente dai Manuali Ufficiali Motorola (MC68000UM, MC68010UM, MC68020UM, MC68030UM, MC68040UM, MC68060UM). La colonna 68000 è la fonte di verità (verificata contro MC68000UM Table 2-2, Instruction Set Summary). La colonna 68020 è verificata contro MC68020UM Table 1-2 (Instruction Set). La colonna 68030 è verificata contro MC68030UM Table 1-2 (Instruction Set) + Section 1.7 (MMU). La colonna 68040 è verificata contro MC68040UM Table 1-4. La colonna 68060 è verificata contro MC68060UM Table 1-3, Appendix C.2, e Section 6.5.1. Le altre colonne CPU sono compilate incrementalmente man mano che ciascun manuale di riferimento viene processato.
Indice¶
- Come leggere la tabella
- Matrice istruzioni 680x0
- Differenze specifiche 68000 — set di istruzioni di base
- Differenze specifiche 68010 — primitive di virtualizzazione, modalità loop
- Differenze specifiche 68020 — unità bit-field, bus a 32 bit, interfaccia coprocessore
- Differenze specifiche 68030 — MMU integrata (PMMU), cache separate
- Differenze specifiche 68040 — MMU + FPU integrati, cache separate
- Differenze specifiche 68060 — superscalare dual-issue, primitive rimosse via M68060SP (
68060.lib+68060f.lib) - Riepilogo matrice di compatibilità
- Note semantiche
- Vedi anche
Come leggere la tabella¶
- ✅ — native: l'istruzione è implementata nel silicio della CPU
- ⚠ — trap/software-support: l'encoding è riconosciuto come caso di compatibilità ma non è completato in hardware; la CPU solleva l'eccezione documentata e il software può emularla se sono installati il pacchetto di supporto/handler richiesti
- ❌ — unsupported: l'istruzione non fa parte dell'ISA di questa CPU
- ❓ — da confermare contro il manuale ufficiale (manuale non ancora processato)
- italics — l'istruzione esiste con semantica ristretta (es. solo supervisore, dipendente dalla modalità, rimossa/sostituita su una CPU successiva)
Matrice istruzioni 680x0¶
La matrice qui sotto incrocia le istruzioni documentate contro ciascuna generazione di CPU. ✅ = native, ⚠ = richiede il percorso di eccezione/supporto-software documentato, ❌ = non supportata/non parte dell'ISA implementata da quel processore, ❓ = non ancora verificata. La colonna 68060 Pipe si applica solo al 68060 e indica quale Operand Execution Pipeline (per MC68060UM §10, Superscalar Classification):
pOEP-only— OEP primaria, blocca la secondaria (no dual-issue)pOEP | sOEP— idonea per dual-issue (dispatch parallelo in entrambe le pipeline)pOEP-until-last— esegue su pOEP ma blocca la sOEP fino al completamentopOEP-but-allows-sOEP— tipicamente FPU (esecuzione integer parallela consentita)- Per 68000/68010/68020/68030/68040: la colonna pipe è
—(nessun superscalare)
Vedi Conteggi cicli di clock sotto per i tempi di esecuzione per CPU.
Movimento dati¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
EXG |
Scambia registri | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
LEA |
Carica indirizzo effettivo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
LINK |
Collegamento stack | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-until-last |
MOVE |
Sposta (R→R base) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
MOVEA |
Sposta indirizzo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
MOVE from CCR |
Leggi CCR (68010+) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MOVE to CCR |
Scrivi CCR | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
MOVE from SR |
Leggi SR (privilegiata dal 68010+) | ✅* | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MOVE to SR |
Scrivi SR (supervisore) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MOVE USP |
Sposta puntatore stack utente (supervisore) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MOVEC |
Sposta registro di controllo (supervisore) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MOVEM |
Sposta registri multipli | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MOVEP |
Sposta dati periferici | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠ | (emulata) |
MOVEQ |
Sposta rapido (immediato) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
MOVES |
Sposta con function code alternato (supervisore) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MOVE16 |
Sposta blocco 16 byte (allineato a 16 byte; forme con postincremento registro e absolute-long) | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | pOEP-only |
PEA |
Salva indirizzo effettivo sullo stack | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
SWAP |
Scambia metà registro | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
UNLK |
Scollega stack | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
Aritmetica interi¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
ABCD |
Addizione decimale con extend | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
ADD |
Addizione binaria | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ADDA |
Addizione indirizzo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ADDI |
Addizione immediata | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ADDQ |
Addizione rapida | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ADDX |
Addizione con extend | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
CLR |
Azzera operando | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
CMP |
Confronto | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
CMPA |
Confronto indirizzo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
CMPI |
Confronto immediato | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
CMPM |
Confronto memoria | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
CMP2 |
Confronta contro limiti, setta cc (68020+; emulata su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ⚠ | (emulata) |
DIVS.W |
Divisione con segno 32÷16→16r:16q | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
DIVS.L |
Divisione con segno 32÷32→32q | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
DIVSL.L |
Divisione con segno 32÷32→32r:32q (output 64 bit, emulata su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ⚠ | (emulata) |
DIVU.W |
Divisione senza segno 32÷16→16r:16q | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
DIVU.L |
Divisione senza segno 32÷32→32q | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
DIVUL.L |
Divisione senza segno 32÷32→32r:32q (output 64 bit, emulata su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ⚠ | (emulata) |
EXT.W |
Estensione segno byte→word | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
EXT.L |
Estensione segno word→long | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
EXTB.L |
Estensione segno byte→long | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
MULS.W |
Moltiplicazione con segno 16×16→32 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MULS.L |
Moltiplicazione con segno 32×32→32 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MULS.L (wide) |
Moltiplicazione con segno 32×32→64 (output 64 bit, emulata su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ⚠ | (emulata) |
MULU.W |
Moltiplicazione senza segno 16×16→32 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MULU.L |
Moltiplicazione senza segno 32×32→32 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
MULU.L (wide) |
Moltiplicazione senza segno 32×32→64 (output 64 bit, emulata su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ⚠ | (emulata) |
NBCD |
Negazione decimale con extend | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
NEG |
Negazione | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
NEGX |
Negazione con extend | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
PACK |
Impacca BCD (68020+; nativa su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
SBCD |
Sottrazione decimale con extend | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
SUB |
Sottrazione binaria | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
SUBA |
Sottrazione indirizzo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
SUBI |
Sottrazione immediata | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
SUBQ |
Sottrazione rapida | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
SUBX |
Sottrazione con extend | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
TAS |
Test e set | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
TST |
Test | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
UNPK |
Spacca BCD (68020+; nativa su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
Logiche e bit-field¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
AND |
AND logico | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ANDI |
AND immediato | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ANDI to CCR |
AND immediato a CCR | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
ANDI to SR |
AND immediato a SR (supervisore) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BFCHG |
Test bit field e cambia (68020+) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BFCLR |
Test bit field e azzera (68020+) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BFEXTS |
Estrai bit field con segno (68020+) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BFEXTU |
Estrai bit field senza segno (68020+) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BFFFO |
Trova primo uno in bit field (68020+) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BFINS |
Inserisci bit field (68020+) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BFSET |
Test bit field e setta (68020+) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BFTST |
Test bit field (68020+) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
EOR |
OR esclusivo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
EORI |
EOR immediato | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
EORI to CCR |
EOR immediato a CCR | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
EORI to SR |
EOR immediato a SR (supervisore) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
NOT |
Complemento logico | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
OR |
OR logico | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ORI |
OR immediato | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ORI to CCR |
OR immediato a CCR | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
ORI to SR |
OR immediato a SR (supervisore) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
Manipolazione bit¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
BCHG |
Test bit e cambia | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
BCLR |
Test bit e azzera | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
BSET |
Test bit e setta | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
BTST |
Test bit | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
Shift e rotazione¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
ASL / ASR |
Shift aritmetico sinistra/destra | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
LSL / LSR |
Shift logico sinistra/destra | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ROL / ROR |
Rotazione sinistra/destra (senza X) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
ROXL / ROXR |
Rotazione sinistra/destra con extend | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
Operazioni atomiche in memoria (68020+)¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
CAS |
Confronta-e-scambia | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
CAS2 |
Confronta-e-scambia dual (68020+; emulata su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ⚠ | (emulata) |
Controllo di programma¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
Bcc |
Salto condizionato | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-but-allows-sOEP¹ |
BRA |
Salto incondizionato | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BSR |
Salto a sottoprogramma | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
CALLM |
Chiama modulo (solo 68020) | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | (rimossa) |
DBcc |
Decrementa e salta condizionatamente | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-but-allows-sOEP |
JMP |
Salto | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
JSR |
Salto a sottoprogramma | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
NOP |
Nessuna operazione | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
RTD |
Ritorna e dealloca (68010+) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
RTM |
Ritorna da modulo (solo 68020) | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | (rimossa) |
RTR |
Ritorna e ripristina CCR | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
RTS |
Ritorna da sottoprogramma | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
TRAPcc |
Trap se condizione (68020+; nativa su 68060, pOEP-only) | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
¹ Un'istruzione Bcc è pOEP-but-allows-sOEP se non è predetta dalla branch cache E la direzione è forward, OPPURE se la Bcc è predetta come branch "non preso". Le istruzioni Bcc predette-come-prese bloccano la sOEP fino a quando il branch non si risolve.
Controllo limiti (68020+)¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
CHK |
Controlla registro contro limiti | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
CHK2 |
Controlla registro contro limiti (68020+; emulata su 68060) | ❌ | ❌ | ✅ | ✅ | ✅ | ⚠ | (emulata) |
Controllo di sistema¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
ILLEGAL |
Trap istruzione illegale | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
RESET |
Asserta linea RESET (supervisore) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
RTE |
Ritorna da eccezione (supervisore) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
STOP |
Ferma e attendi interrupt (supervisore) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
TRAP |
Istruzione trap (vettorizzata) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP | sOEP |
TRAPV |
Trap su overflow | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
BKPT |
Breakpoint (68010+) | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | pOEP-only |
Controllo cache e MMU¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 | 68060 Pipe |
|---|---|---|---|---|---|---|---|---|
CINV |
Invalida linee di cache (68040+) | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | pOEP-only |
CPUSH |
Spedisci e invalida linee di cache (68040+) | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | pOEP-only |
PFLUSH |
Svuota voci ATC (68030+; sintassi/semantica differiscono per generazione; nativa su MC68060/MC68LC060 completi) | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | pOEP-only |
PFLUSHA |
Svuota tutte le voci ATC (68030+; nativa su 68040/68060 per MC68060UM §4.7.2 + Table 10-24) | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | pOEP-only |
PLOAD (PLOADR/PLOADW) |
Carica voce in ATC (68030+) | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | pOEP-only |
PMOVE |
Sposta da/verso registri MMU (68030+) | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | pOEP-only |
PMOVEFD |
Sposta da/verso registri MMU con flush-disable (68030+) | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | pOEP-only |
PTEST (PTESTR/PTESTW) |
Testa un indirizzo logico (68030/68040; non implementata su 68060, dove PLPA è l'helper di traduzione specifico del processore) |
❌ | ❌ | ❌ | ✅ | ✅ | ❌ | pOEP-only |
Unità in virgola mobile (FPU) — coprocessore MC68881/68882 su 68020/68030, integrata su 68040/68060¶
Il set di istruzioni FPU fu definito dal MC68881 e MC68882. Il MC68040 integra un sottoinsieme comunemente usato di quell'architettura in hardware; è importante notare che il suo set nativo include operazioni FP condizionali come FBcc, FDBcc, FScc, e FTRAPcc, mentre funzioni come FINT, FINTRZ, FGETEXP, FGETMAN, FMOD, FREM, FSCALE, FMOVECR, e le funzioni trascendentali fanno affidamento su M68040FPSP quando è richiesta la compatibilità software. Il MC68060 implementa un sottoinsieme hardware diverso: diverse operazioni che sono native sul 68040 (in particolare FDBcc, FScc, e FTRAPcc) non sono implementate sul 68060 e sono gestite attraverso il suo pacchetto di supporto software.
Il 68882 è pin- e software-compatibile con il 68881 e implementa lo stesso set di istruzioni FPU (per MC68881/MC68882UM §1.4, verificato contro Table 8-2 vs Table 8-3). Nessuna istruzione, operazione monadica, operazione diadica, mnemonic condizionale, o formato dati è aggiunto dal 68882 — ogni istruzione presente sul 68882 è anche presente sul 68881 (con tempi di esecuzione documentati in Table 8-2). Il 68882 invece migliora prestazioni e concorrenza:
- Prestazioni: throughput maggiore rispetto al MC68881 attraverso miglioramenti implementativi, inclusa hardware dedicato per la conversione e minore overhead dell'interfaccia del coprocessore. Sia il MC68881 che il MC68882 usano un'architettura a unità aritmetica/barrel-shifter a 67 bit; il datapath a 67 bit non è una modifica esclusiva del MC68882.
- Esecuzione concorrente di istruzioni FP multiple — solo il 68882 può emettere una nuova istruzione FP prima che la precedente completi (UM §1, §8).
- Hardware dedicato per la conversione veloce binary-real ↔ extended-precision (UM §1).
- Estensione dello state-frame per il contesto di esecuzione concorrente: lo state frame FSAVE/FRESTORE include bit solo per MC68882 per la mappa di validità dei registri operando (per UM §7.2.4.4, "INTERNAL STATE INFORMATION (MC68882 ONLY)").
- Modalità periferica a 8 bit documentata più completamente (il 68881 la supporta anche tramite il pin SIZE).
Set di istruzioni floating-point MC68881/MC68882¶
La documentazione combinata ufficiale MC68881/MC68882 descrive l'ISA floating-point condivisa. I gruppi funzionali usati qui sono cinque classi principali:
- Movimenti (tra 68882 e memoria, o 68882 ↔ 68882):
FMOVE.<fmt> <ea>,FPn/FMOVE.<fmt> FPm,<ea>/FMOVE.X FPm,FPn/FMOVEM <list>,<ea>(sposta registri multipli) - Operazioni monadiche (un operando → risultato nel registro dati floating-point): 27 istruzioni —
FABS,FACOS,FASIN,FATAN,FATANH,FCOS,FCOSH,FETOX,FETOXM1,FGETEXP,FGETMAN,FINT,FINTRZ,FLOG10,FLOG2,FLOGN,FLOGNP1,FNEG,FSIN,FSINCOS,FSINH,FSQRT,FTAN,FTANH,FTENTOX,FTST,FTWOTOX - Operazioni diadiche (due operandi → risultato in FPn): 10 istruzioni —
FADD,FCMP,FDIV,FMOD,FMUL,FREM,FSCALE,FSGLDIV,FSGLMUL,FSUB - Branch, set, e trap su condizione:
FBcc,FDBcc,FScc,FTRAPcc— ciascuna con 32 specificatori di test condizionale (F,EQ,OGT,OGE,OLT,OLE,OGL,OR,UN,UEQ,UGT,UGE,ULT,ULE,NE,T,SF,SEQ,GT,GE,LT,LE,GL,GLE,NGLE,NGL,NLE,NLT,NGE,NGT,SNE,ST) - Varie / controllo FPU:
FMOVE FPcr,<ea>/FMOVE <ea>,FPcr(registri di controllo: FPCR, FPSR, FPIAR),FSAVE <ea>,FRESTORE <ea>
Nella matrice sotto, le colonne 68020/68030 si applicano a entrambi il 68881 e il 68882 — i due coprocessori condividono lo stesso set di istruzioni per UM §1.4, quindi non ci sono istruzioni solo 68882 da marcare nelle etichette delle righe.
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 |
|---|---|---|---|---|---|---|---|
FABS |
Valore assoluto | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FADD |
Addizione FP | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FBcc |
Branch FP condizionato | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FCMP |
Confronto FP | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FDBcc |
Decrementa e branch FP | ❌ | ❌ | ✅² | ✅² | ✅ | ⚠¹ |
FDIV |
Divisione FP | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FINT |
Parte intera FP (silicio 68881+; emulata su 68040 via M68040FPSP) | ❌ | ❌ | ✅² | ✅² | ⚠³ | ✅ |
FINTRZ |
Parte intera FP, arrotondamento a zero (silicio 68881+; emulata su 68040 via M68040FPSP) | ❌ | ❌ | ✅² | ✅² | ⚠³ | ✅ |
FMOVE |
Sposta FP (incluso da/verso FPcr) | ❌ | ❌ | ✅² | ✅² | ✅ | ✅* |
FMOVEM |
Sposta FP multiplo | ❌ | ❌ | ✅² | ✅² | ✅ | ✅* |
FMOVECR |
Sposta da ROM costanti FP (silicio 68881+; emulata su 68040/68060 via M68040FPSP / 68060f.lib) |
❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FMUL |
Moltiplicazione FP | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FNEG |
Negazione FP | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FNOP |
FP no-op | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FRESTORE |
Ripristina state frame FPU (supervisore) | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FSAVE |
Salva state frame FPU (supervisore) | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FScc |
Set FP su condizione | ❌ | ❌ | ✅² | ✅² | ✅ | ⚠¹ |
FTRAPcc |
Trap FP su condizione | ❌ | ❌ | ✅² | ✅² | ✅ | ⚠¹ |
FSGLDIV |
Divisione FP singola precisione | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FSGLMUL |
Moltiplicazione FP singola precisione | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FSQRT |
Radice quadrata FP | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FSUB |
Sottrazione FP | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
FTST |
Test FP | ❌ | ❌ | ✅² | ✅² | ✅ | ✅ |
#### Trascendentali monadiche (silicio 68881+; silicio 68882 identico; emulate su 68040 via M68040FPSP e su 68060 via 68060f.lib) |
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 |
|---|---|---|---|---|---|---|---|
FACOS |
Arcocoseno FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FASIN |
Arcoseno FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FATAN |
Arcotangente FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FATANH |
Arcotangente iperbolica FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FCOS |
Coseno FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FCOSH |
Coseno iperbolico FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FETOX |
FP eˣ | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FETOXM1 |
FP eˣ−1 | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FGETEXP |
Ottieni esponente FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FGETMAN |
Ottieni mantissa FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FLOG10 |
FP log₁₀ | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FLOG2 |
FP log₂ | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FLOGN |
FP ln | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FLOGNP1 |
FP ln(x+1) | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FSIN |
Seno FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FSINCOS |
Seno+coseno FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FSINH |
Seno iperbolico FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FTAN |
Tangente FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FTANH |
Tangente iperbolica FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FTENTOX |
FP 10ˣ | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FTWOTOX |
FP 2ˣ | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
Trascendentali diadiche (silicio 68881+; FMOD/FREM/FSCALE emulate su 68040 via M68040FPSP e su 68060 via 68060f.lib)¶
| Mnemonic | Operazione | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 |
|---|---|---|---|---|---|---|---|
FMOD |
Modulo FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FREM |
Resto IEEE FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
FSCALE |
Scala esponente FP | ❌ | ❌ | ✅² | ✅² | ⚠³ | ⚠¹ |
¹ Emulazione FPU 68060 (per MC68060UM §6.5.1, Table 6-11): la FPU 68060 non implementa queste nel silicio — fanno trap sul vettore 11 (F-line non implementata) e sono emulate dal M68060SP a livello OS (con 68060f.lib per FPU + 68060.lib per integer).
² Richiede un coprocessore floating-point esterno MC68881 o MC68882 sul MC68020/MC68030, connesso attraverso l'interfaccia coprocessore M68000. Il MC68040 e il MC68060 completi hanno la FPU integrata on-die.
³ Emulazione FPU 68040 (per MC68040UM §9.1 e Appendix E): la FPU 68040 non implementa queste nel silicio — fanno trap sul vettore 11 (F-line non implementata) e sono emulate dal M68040FPSP (Motorola Floating-Point Software Package) a livello OS.
L'MC68LC040 e l'MC68EC040 non hanno silicio FPU. Le istruzioni floating-point legali di MC68040/MC68881/MC68882 sono trattate come istruzioni floating-point non implementate ed entrano nel percorso di eccezione F-line (vettore 11); il software di sistema può emularle. Vedi le appendici specifiche per processore di MC68040UM per i dettagli dello stack frame delle varianti.
* Il 68060 ha mantenuto la maggior parte delle forme di FMOVE e FMOVEM ma la variante con lista di registri dinamica di FMOVEM.X e la forma #immediate, lista di 2 o 3 registri di controllo di FMOVEM.L non sono implementate (emulate). Vedi Differenze specifiche 68060 per le restrizioni esatte.
Differenze specifiche 68000¶
Il MC68000 (Motorola, 1979) è il riferimento per il modello di programmazione 680x0. I membri successivi della famiglia preservano la maggior parte del codice oggetto a livello utente ma introducono un piccolo numero di differenze di privilegio, istruzione, MMU e implementazione documentate sotto.
Panoramica architettura¶
- Bus dati esterno a 16 bit (il 68008 aveva un bus a 8 bit; il 68000 stesso aveva 16 bit)
- Bus indirizzi esterno a 24 bit (spazio di indirizzi lineare 16 MiB)
- 8 registri dati (
D0-D7, 32 bit) e 8 registri indirizzo (A0-A7, 32 bit;A7è il puntatore stack attivo, conUSPeSSPselezionati dal bitSdel registro di stato) - Due livelli di privilegio (utente, supervisore) con puntatori stack separati
- Registro di stato (
SR) — 16 bit, il byte basso è il registro dei condition code (CCR) accessibile da modalità utente - Program Counter (
PC) — registro a 32 bit ma solo i 24 bit bassi indirizzabili esternamente - Due chip MOS 8520 CIA forniscono timer e servizi I/O periferici usati dalla tastiera, porta parallela, segnali di controllo floppy e altre funzioni di sistema. Sono dispositivi della famiglia CIA imparentati con il MOS 6526; la UART seriale principale dell'Amiga è implementata in Paula, non nelle CIA
- Nessuna MMU o FPU on-chip (entrambe erano esterne o aggiunte su CPU successive)
- Nessuna cache istruzioni (aggiunta dal 68020 in poi)
Modalità di indirizzamento supportate dal 68000¶
Il 68000 supporta 14 modalità di indirizzamento (il set originale; il 68020 ne aggiunge altre):
| Modalità | Esempio sintassi | Note |
|---|---|---|
| Registro dati diretto | Dn |
|
| Registro indirizzo diretto | An |
Una in più rispetto ai registri dati |
| Registro indirizzo indiretto | (An) |
|
| Registro indirizzo indiretto con post-incremento | (An)+ |
Per operandi byte, A7 incrementa di 2 invece di 1 per preservare l'allineamento a word |
| Registro indirizzo indiretto con pre-decremento | -(An) |
Per operandi byte, A7 decrementa di 2 invece di 1 |
| Registro indirizzo indiretto con displacement a 16 bit | (d16,An) |
|
| Registro indirizzo indiretto con indice (8 bit) | (d8,An,Xn) |
Solo 68000 — esteso nel 68020 |
| Assoluto corto | (xxx).W |
Valore a 16 bit esteso con segno alla larghezza di indirizzo del processore |
| Assoluto lungo | (xxx).L |
Indirizzo a 32 bit |
| Program counter indiretto con displacement | (d16,PC) |
Per codice position-independent |
| Program counter indiretto con indice | (d8,PC,Xn) |
|
| Immediato (dato) | #<data> |
Byte, word, o longword |
| Immediato (indirizzo) | #<address> |
Valido come dato immediato per istruzioni come MOVEA; LEA non accetta una sorgente immediata |
| Forme registro di stato / CCR | SR / CCR |
Il privilegio dipende dall'istruzione e dalla CPU: MOVE to SR è privilegiata; MOVE from SR diventa privilegiata dal 68010+; l'accesso al CCR non è privilegiato |
Riepilogo set di istruzioni¶
Il set di istruzioni baseline del MC68000 include MOVE to CCR ma non MOVE from CCR; quest'ultima fu introdotta dal MC68010. Poiché la documentazione Motorola a volte presenta tabelle di riepilogo per tutta la famiglia che includono istruzioni da più di un membro, questo articolo evita di assegnare un singolo "conteggio mnemonico" al MC68000 a meno che la convenzione di conteggio non sia dichiarata esplicitamente.
Le distinzioni baseline importanti usate dalla matrice sono:
MOVE to CCRè disponibile sul MC68000.MOVE from CCR,BKPT,MOVEC,MOVES, eRTDsono aggiunte del MC68010 e successivi.MOVE from SRè non privilegiata sul MC68000 ma privilegiata sul MC68010 e processori successivi.CAS,CAS2, istruzioni bit-field,CHK2/CMP2,PACK/UNPK,TRAPcc, forme di moltiplicazione/divisione long, e il set di istruzioni del coprocessore generico arrivano con il MC68020.
Note semantiche specifiche del 68000¶
MOVE from SRè non privilegiata sul 68000 (le CPU successive la rendono privilegiata per la conformità di virtualizzazione Popek-Goldberg).RTEusa un semplice stack frame a 3 word (stato + PC); le CPU successive aggiungono formati espansi.- Nessuna cache istruzioni — ogni fetch di istruzione è un ciclo di bus (il 68010 introdusse una coda di prefetch a 3 word; il 68020 aggiunse una cache istruzioni a 256 byte).
- Read-modify-write atomico è supportato —
TASusa un ciclo di bus read-modify-write indivisibile ed è la primitiva di sincronizzazione baseline sul 68000. I processori successivi aggiungonoCAS/CAS2; la policy cache/coerenza a livello di sistema conta ancora nei design multiprocessore.
Rilevanza Amiga¶
Il 68000 alimentò la prima linea Amiga in due varianti di package:
- DIP-64 (through-hole): Amiga 1000 (1985), A500 (1987), A2000 (1987).
- PLCC-68 (surface-mount): CDTV (1991), Amiga 600 (1992).
L'A600 usò la variante PLCC surface-mount per adattarsi al case più compatto a basso costo (il clock nominale più basso rispetto all'A500 non è una misura di risparmio specifica dell'A600 — è determinato dallo standard video: i modelli Amiga PAL (A500, A600, A1200, ecc.) operano a ≈ 7.09379 MHz mentre i modelli NTSC (A500, A600, A1200, ecc.) operano a ≈ 7.15909 MHz, in entrambe le linee di modelli). I modelli Amiga successivi (A1200, A3000, A4000) furono equipaggiati con CPU di classe 68020/030/040. Il software specificamente mirato al 68000 generalmente migra bene verso i processori successivi, soggetto alle avvertenze di privilegio e compatibilità descritte in questo riferimento; il software che usa istruzioni di CPU successive ovviamente non può girare su un 68000 semplice.
Varianti della famiglia MC68000¶
La documentazione Motorola/NXP distingue il MC68000 originale e diverse implementazioni correlate. Suffissi di velocità come -8, -10, ecc. sono gradi di velocità, non varianti ISA separate. I membri della famiglia comunemente documentati rilevanti qui sono:
| Variante | Bus dati | Bus indirizzi | Note |
|---|---|---|---|
| MC68000 | 16 bit | 24 bit (16 MiB) | implementazione originale |
| MC68008 | 8 bit | 20 bit o 22 bit, a seconda del package/versione | larghezza bus dati esterno e pin count ridotti |
| MC68HC000 | 16 bit | 24 bit | implementazione CMOS del MC68000 |
| MC68HC001 | 8/16 bit selezionabile | 24 bit | derivato CMOS con larghezza bus dati esterno selezionabile |
| MC68EC000 | 16 bit | 24 bit | implementazione embedded a basso costo |
| MC68SEC000 | 16 bit | 24 bit | implementazione statica, a basso consumo |
Queste parti mantengono il modello di programmazione del MC68000 a meno che la loro documentazione individuale non dichiari diversamente; package, caratteristiche elettriche e dettagli dell'interfaccia bus differiscono tra varianti.
Differenze specifiche 68010¶
Il 68010 è binario-compatibile con il codice utente del 68000 eccetto per il cambio di privilegio importante di MOVE from SR: sul 68010 diventa solo-supervisore. Per preservare l'accesso in modalità utente ai condition code, il 68010 aggiunge MOVE from CCR. MOVE to CCR esiste già sul 68000 e rimane non privilegiata.
Il 68010 introdusse anche uno stack frame RTE espanso (il throwaway frame e il bus-cycle restart frame) per il recupero da bus-error e supporto memoria virtuale — l'istruzione si chiama ancora RTE, ma il formato dello stack frame differisce da quello del 68000. Gli handler di eccezione a livello OS devono controllare la format word sullo stack per distinguere i due casi.
In aggiunta a MOVE from CCR, il 68010 aggiunse altri quattro mnemonici:
| Mnemonic | Categoria | Scopo |
|---|---|---|
BKPT |
Controllo di sistema | Esegue ciclo di acknowledge breakpoint; trap come istruzione illegale se nessun ack |
MOVEC |
Movimento dati | Sposta da/verso registri di controllo (VBR, SFC, DFC, USP sul 68010) |
MOVES |
Movimento dati | Sposta con function code alternato (supervisore) |
RTD |
Controllo di programma | Ritorna da sottoprogramma e dealloca parametri: estrae PC dallo stack, poi somma un displacement a 16 bit esteso con segno a SP ((SP) -> PC; SP + 4 + d_n -> SP) |
Fu aggiunto anche un acceleratore modalità loop. Quando un loop a singola istruzione idoneo è controllato da DBcc, il processore può eseguire il loop senza recuperare ripetutamente l'istruzione del loop dal bus esterno. Questo è un meccanismo interno di loop/prefetch, non una cache di istruzioni generica.
Varianti MC68010¶
Questo riferimento tratta il MC68010 come il target architetturale 68010. Non inferire varianti 68010 aggiuntive EC, SEC o LC per analogia con la nomenclatura Motorola successiva a meno che un documento specifico Motorola per quella parte non sia disponibile.
Il 68010 non fu ampiamente usato nell'hardware Amiga — l'A500/A1000/A2000 usarono il 68000, e Commodore in seguito passò a processori di classe 68020 in macchine come l'A1200/CD32. Il Macintosh LC usò una CPU di classe 68020 e il Sun-3/80 usò un 68030, non un 68010.
Differenze specifiche 68020¶
Il MC68020 fu il primo membro della famiglia 680x0 con un data path a 32 bit (i precedenti erano a 16 bit sul bus dati), spazio di indirizzi a 32 bit (4 GiB lineari), una cache istruzioni on-chip (256 byte), e dynamic bus sizing (auto-detection porta 8/16/32-bit). Fu anche il primo ad aggiungere un'unità bit-field e un'interfaccia coprocessore.
Varianti MC68020¶
| Variante | Note |
|---|---|
| MC68020 | implementazione completa con bus indirizzi esterno a 32 bit (spazio di indirizzi 4 GiB) e interfaccia coprocessore M68000 |
| MC68EC020 ("Embedded Controller") | bus indirizzi esterno a 24 bit (spazio di indirizzi 16 MiB); omette diversi segnali di interfaccia bus presenti sul MC68020 ma mantiene l'interfaccia coprocessore M68000, incluso il supporto per coprocessori Motorola come MC68881/MC68882 |
Usato in: Commodore CD32 (14.3 MHz) e come famiglia CPU base dell'Amiga 1200, il cui 68EC020 è limitato a un bus indirizzi esterno a 24 bit.
Il MC68020/MC68EC020 non ha MMU integrata. La funzionalità di gestione della memoria, quando richiesta, è esterna alla CPU; non descrivere il MC68EC020 come avente un "bus coprocessore MMU" fabbricato separatamente disabilitato mantenendo solo un'interfaccia FPU. L'interfaccia coprocessore M68000 documentata del processore è comune a MC68020/EC020.
Per MC68020UM Table 1-2 (pp. 1-10 → 1-11), il 68020 aggiunse le seguenti istruzioni non presenti sul 68000/68010:
Istruzioni bit-field (8)¶
BFCHG, BFCLR, BFEXTS, BFEXTU, BFFFO, BFINS, BFSET, BFTST
Operazioni atomiche in memoria (2)¶
CAS, CAS2 (dual-operand)
Istruzioni di controllo limiti (2)¶
CHK2, CMP2
Impaccamento BCD (2)¶
PACK, UNPK
Trap condizionale (1)¶
TRAPcc (con varianti dimensione operando .W e .L)
Chiamata/ritorno modulo (2) — solo 68020¶
CALLM, RTM
Interfaccia coprocessore (7)¶
cpBcc, cpDBcc, cpGEN, cpRESTORE, cpSAVE, cpScc, cpTRAPcc — definiscono il protocollo generico di istruzioni coprocessore della famiglia M68000 introdotto con il MC68020. I processori successivi mantengono gli encoding delle istruzioni coprocessore rilevanti, ma le loro implementazioni FPU/MMU integrate devono essere descritte secondo i manuali specifici del processore piuttosto che assumere l'interfaccia hardware del coprocessore esterno MC68020.
Varianti di moltiplicazione/divisione long¶
MULS.L (wide, Dh:Dl) 32×32→64, MULU.L (wide, Dh:Dl) 32×32→64, DIVS.L (<ea>,Dr:Dq) 64÷32→32r:32q, DIVU.L (<ea>,Dr:Dq) 64÷32→32r:32q, DIVSL.L (<ea>,Dr:Dq) 32÷32→32r:32q, DIVUL.L (<ea>,Dr:Dq) 32÷32→32r:32q.
Altre estensioni¶
EXTB.L— estensione segno byte→longword (il 68000/68010 avevaEXT.WeEXT.Lsolo per byte→word→longword; il 68020 aggiunge byte→long).
Modalità di indirizzamento introdotte sul 68020¶
Il 68020 aggiunse diverse modalità di indirizzamento non disponibili sulle CPU precedenti:
- Registro indirizzo indiretto con indice (displacement a 8 bit e 32 bit)
- Memory indirect (
(d16,An)e(d32,An,Xi)varianti post-indicizzate) - PC-relativo con indice (displacement a 8 bit e 32 bit, indice scalato)
- Indice scalato (
An,Xi*scaledove scale ∈ {1, 2, 4, 8})
Le modalità di indirizzamento base M68000 complete (registro dati/indirizzo diretto, registro indirizzo indiretto, immediato, assoluto) restano valide.
Supporto macchina virtuale¶
Il MC68020 mantiene ed estende i meccanismi di eccezione riavviabile e privilegio introdotti con il MC68010, rendendolo adatto per design di sistema operativo a memoria virtuale e macchina virtuale. Evita di trattare il MC68020 come un confine pulito "parziale → completo Popek-Goldberg": il problema chiave di virtualizzazione del 68000 (MOVE from SR in modalità utente) era già stato cambiato sul MC68010.
Differenze specifiche 68030¶
Il MC68030 è il 68020 con una MMU integrata (la prima CPU M68k con MMU on-die) e due cache on-chip (256 byte ciascuna, cache istruzioni e dati separate con fill in modalità burst). È largamente binario-compatibile con il 68020 — quasi ogni istruzione del 68020 funziona sul 68030 — con due notevoli eccezioni: CALLM e RTM (le istruzioni di gestione modulo del 68020) furono rimosse sul 68030 per MC68030UM Table 1-2 (appaiono in MC68020UM Table 1-2 ma non nel set di istruzioni del 68030). Aggiunge una nuova famiglia di istruzioni di controllo MMU.
Varianti MC68030¶
| Variante | MMU | Note |
|---|---|---|
| MC68030 | ✅ PMMU on-die (parte completa) | bus modalità burst, cache I/D separate |
| MC68EC030 ("Embedded Controller") | ❌ nessuna MMU on-die | variante embedded senza la MMU integrata MC68030 |
Il pattern è lo stesso del 68040/68060: suffisso "EC" = MMU disabilitata. Il 68030 non ha una variante LC corrispondente a "FPU disabilitata" perché la FPU su questa generazione è il coprocessore esterno 68881/68882 (il 68030 stesso non ha FPU integrata da disabilitare).
Per MC68030UM Table 1-2 (pp. 1-12 → 1-13), il set di istruzioni del 68030 è il set del 68020 più le seguenti istruzioni MMU (e rimuove CALLM e RTM):
Istruzioni MMU aggiunte sul 68030 (8)¶
| Mnemonic | Scopo |
|---|---|
PFLUSH |
Svuota voci ATC (voce puntata da An o tutte le voci) |
PFLUSHA |
Svuota tutte le voci nell'ATC |
PLOADR / PLOADW |
Carica una voce nell'ATC (modalità accesso in lettura o scrittura) |
PMOVE |
Sposta da/verso registri MMU: CRP, SRP, TC, TT0, TT1, MMUSR |
PMOVEFD |
Sposta da/verso registri MMU selezionati sopprimendo l'effetto collaterale normale di flush ATC |
PTESTR / PTESTW |
Sonda un indirizzo logico per la traduzione (modalità accesso in lettura o scrittura) |
Queste istruzioni comunicano con la MMU on-die per gestire l'Address Translation Cache (ATC) — la cache 22-entry fully-associative che mantiene le traduzioni recenti indirizzo-virtuale→fisico. La famiglia PMOVE accede ai registri di controllo MMU (CRP, SRP, TC, TT0, TT1, MMUSR) che definiscono la struttura della tabella di traduzione.
Istruzioni rimosse o sostituite sul 68030¶
Il 68030 mantiene tutto il resto dal 68020 — CALLM, RTM sono elencati nel 68020UM Table 1-2 ma non nel 68030UM Table 1-2, il che significa che Motorola li rimosse con il 68030 (CALLM/RTM erano istruzioni di gestione modulo specifiche del 68020 che non videro uso diffuso al di fuori di alcuni sistemi di nicchia). Bit-field, atomiche, limiti, BCD, trap condizionale, e MUL/DIV long sono tutti mantenuti invariati.
Modalità di indirizzamento sul 68030¶
Il 68030 mantiene il set di modalità di indirizzamento MC68020 (per MC68030UM §1.4, Table 1-1) — nessuna nuova modalità di indirizzamento è introdotta. Le aggiunte del 68030 sono istruzioni MMU (PFLUSH, PLOAD, PMOVE, PTEST, ecc.), non modalità di indirizzamento. Per MC68030UM Appendix A, l'indice scalato (Xn.SIZE*SCALE) e le modalità di indirizzamento memory-indirect sono esplicitamente elencate come estensioni condivise di MC68020 e MC68030, non solo 68030.
Miglioramenti cache e bus¶
- Cache istruzioni 256 byte + cache dati 256 byte on-chip (separate, con fill in modalità burst). Nuovo segnale MMU
CIIN(cache inhibit input) permette all'hardware esterno di marcare regioni di bus come non-cacheable. - Bus modalità burst — riempie 4 long word (16 byte) per cache-line fill in un singolo burst, dimezzando la latenza effettiva della memoria.
- Dynamic bus sizing esteso — auto-detection porta 8/16/32-bit completa sia su fetch di codice che di dati.
MMU sul 68030¶
La MMU del 68030 è un'unità di gestione memoria paginata (PMMU) con queste caratteristiche:
- Traduzione 32 bit logico → 32 bit fisico
- ATC 22-entry fully-associative
- 8 dimensioni di pagina da 256 B a 32 KB
- 2 regioni di traduzione trasparenti (sempre pass-through)
- Registri puntatore root CPU/supervisore (CRP / SRP)
- Attributi di protezione scrittura e protezione supervisore
- Function code a 3 bit (FC0-FC2) per spazi di indirizzi separati
Il set di istruzioni MMU del 68030 è costruito attorno a PMOVE + PFLUSH + PLOAD + PTEST. Il 68040 cambia il modello di programmazione MMU ad accesso ai registri di controllo basato su MOVEC più le sue forme PFLUSH/PTEST. Il MC68060/MC68LC060 completi mantengono le operazioni native della famiglia PFLUSH e aggiungono PLPA; PTEST non è implementata sul 68060. Sul MC68EC060, che non ha MMU, le operazioni specifiche MMU hanno comportamento variante-specifico no-effect/illegal come documentato da MC68060UM.
Differenze specifiche 68040¶
Il MC68040 è la prima CPU di classe Amiga con MMU e FPU integrate on-die. Oltre a portare avanti il set di istruzioni del 68020/68030, il 68040 aggiunse i seguenti gruppi principali di istruzioni:
Varianti MC68040¶
Per MC68040UM (prefazione, "Documentation package for the MC68040, MC68040V, MC68LC040, MC68EC040, and MC68EC040V"), la famiglia 68040 ha cinque varianti documentate:
| Variante | MMU | FPU | Note |
|---|---|---|---|
| MC68040 | ✅ on-die | ✅ on-die | parte completa (5V) |
| MC68040V | ✅ on-die | ❌ (no FPU) | 3.3V static; stessa IU+MMU del MC68040 ma nessuna FPU (solleva eccezione FPU non implementata); aggiunge pin SCD/LFO/LOC e modalità stop a basso consumo; non pin-compatibile con MC68040 |
| MC68LC040 ("Low Cost") | ✅ on-die | ❌ (no FPU) | pin-compatibile con MC68040; nessun silicio FPU per MC68040UM §1.1.1 — le istruzioni FPU sollevano l'eccezione FPU non implementata, nessun pacchetto di emulazione |
| MC68EC040 ("Embedded Controller") | ❌ nessuna MMU on-die | ❌ (no FPU) | variante embedded senza la MMU o FPU integrata |
| MC68EC040V | ❌ | ❌ | variante di tensione dell'EC040 (3.3V) |
Pattern (portato avanti concettualmente al 68060): le varianti LC mantengono la MMU ma omettono la FPU; le varianti EC omettono sia la MMU che la FPU integrate. Sulle varianti senza FPU della famiglia 68040, le istruzioni floating-point legali generano l'eccezione floating-point/F-line non implementata documentata così che il software di sistema possa emularle.
La matrice di istruzioni sopra assume la parte completa MC68040. Sul MC68040V, MC68LC040, e MC68EC040/MC68EC040V, le istruzioni FPU non sono eseguite dall'hardware ed entrano nel percorso di eccezione floating-point/F-line non implementata (vettore 11); un sistema operativo può fornire emulazione software. Sulle varianti EC la MMU integrata è assente, quindi la colonna MMU della parte completa non si applica.
Mask set del 68040 (per verifica community)¶
Per la lista mantenuta dalla community (compilata da fonti multiple incluso l'Amiga past originale), le seguenti revisioni di mask del 68040 sono documentate:
| Mask | Revisione | MMU | FPU | Geometry [µm] | max speed osservata [MHz] | Nota |
|---|---|---|---|---|---|---|
| E71M | — | ✅ | — | 0.65 | 40 | (nessuna ancora) |
| E23G | — | ✅ | — | 0.65 | 40 | (nessuna ancora) |
| D39H | — | ✅ | — | 0.8 | 40 | la ventola dovrebbe essere impostata su "cool", non "quiet" |
| D43B | — | ✅ | — | 0.8 | 25 | Può girare a 33MHz con over/under-volting |
| D50D | — | ✅ | — | 0.8 | 33 | gira molto caldo, non far girare senza cooler |
| D98D | — | ✅ | — | 0.8 | 33 | mask XC, possibilmente più veloce |
| E31F | — | ✅ | — | 0.65 | 40 | (nessuna ancora) |
| E26A | — | TBD | TBD | 0.65 | TBD (probabilmente 40) | Non testata - nessun campione disponibile |
| E42K | — | ✅ | — | 0.65 | 40 | Qualificazione MC completa |
| K63H | — | ✅ | — | 0.57 | 40 | 5V-type più veloce, finora non testato |
| L88M | — | ✅ | — | 0.57 | 40 | 5V-type più veloce, finora non testato |
| F54F | — | ✅ | — | 0.5 | 40 | tipo 3.3V, non supportato da ACA1240/1260 |
| D33T | — | ✅ | — | 0.5 | 40 | tipo 3.3V, non supportato da ACA1240/1260 |
Istruzioni bit-field (portate dal 68020)¶
Il 68020 introdusse l'accesso dinamico ai bit-field. Tutti gli otto mnemonici bit-field — BFCHG, BFCLR, BFEXTS, BFEXTU, BFFFO, BFINS, BFSET, BFTST — sono portati avanti sul 68040.
Confronta-e-scambia atomico¶
CAS e CAS2 furono introdotti sul 68020. Il 68040 mantiene sia CAS che CAS2; sul 68060, CAS2 (la forma dual-operand) è emulata via M68060SP per MC68060UM Appendix C.2.
Moltiplicazione e divisione multi-precisione¶
Il 68020 introdusse le forme long di moltiplicazione e divisione:
| Mnemonic | Operazione |
|---|---|
MULS.L |
32×32→32 |
MULS.L (wide, Dh:Dl) |
32×32→64 |
MULU.L |
32×32→32 |
MULU.L (wide) |
32×32→64 |
DIVS.L |
32÷32→32q |
DIVU.L |
32÷32→32q |
DIVSL.L |
64÷32→32r:32q |
DIVUL.L |
64÷32→32r:32q |
Il 68040 porta tutte queste.
Istruzioni cache, MMU e block-move specifiche del 68040¶
Il 68040 aggiunge nuove istruzioni cache/block-move e rivede le forme delle istruzioni MMU. PFLUSH e PTEST non sono nuovi nomi mnemonici — esistono già sul MC68030 — ma i loro encoding/semantica appartengono al modello di programmazione MMU del 68040:
| Mnemonic | Categoria | Scopo |
|---|---|---|
CINV (CINVL/CINVP/CINVA) |
Controllo cache | Invalida linee di cache istruzioni/dati (68040+) |
CPUSH (CPUSHL/CPUSHP/CPUSHA) |
Controllo cache | Spedisci linee di cache dati dirty e invalida (68040+) |
MOVE16 |
Movimento dati | Sposta blocco allineato a 16 byte; sono definite forme con postincremento registro e absolute-long |
PFLUSH (PFLUSH/PFLUSHN/PFLUSHA/PFLUSHAN) |
Controllo MMU | Svuota voci ATC — sostituisce l'interfaccia PMOVE del 68030 |
PTEST (PTESTR/PTESTW) |
Controllo MMU | Sonda stato voci ATC — sostituisce l'interfaccia PMOVE del 68030 |
Istruzioni rimosse/sostituite¶
Il 68040 rimuove o sostituisce diverse istruzioni dal 68030:
- Interfaccia MMU sostituita: Il
PMOVEdel 68030 (sposta da/verso registri MMU: CRP, SRP, TC, TT0, TT1, MMUSR) è sostituito sul 68040 daMOVECe le istruzioniPFLUSH/PTEST. Il codice che parla con la MMU del 68030 deve essere riscritto per il 68040. - Move-from-SR ancora privilegiata (portata dal 68010+).
FPU sul 68040¶
Il 68040 ha una FPU integrata (nessun 68882 esterno necessario). Implementa un sottoinsieme sostanziale e comunemente usato dell'ISA floating-point MC68881/MC68882 in hardware, mentre il software completa la compatibilità per le operazioni rimanenti e i tipi di dato:
- Le trascendentali monadiche,
FINT,FINTRZ,FGETEXP,FGETMAN,FMOD,FREM,FSCALE,FMOVECR, e funzioni di compatibilità correlate sono fornite dal M68040FPSP quando non sono eseguite direttamente nel silicio del 68040. Per contrasto, le istruzioni floating-point condizionali comeFDBcc,FScc, eFTRAPccsono implementate dal MC68040 stesso. Le istruzioni floating-point non implementate usano il vettore 11. - I formati dello state frame
FRESTOREeFSAVEdifferiscono leggermente tra il 68882 e la FPU integrata del 68040; il codice OS deve fare il dispatch correttamente.
Differenze specifiche 68060¶
Il MC68060 è il processore finale della famiglia M68k progettato per il computing desktop ad alte prestazioni. Fu architettato per l'esecuzione superscalare dual-issue: due istruzioni intere possono essere emesse e completate in parallelo. Per raggiungere il timing closure alla frequenza di clock target, il 68060 rimosse (o "non implementò") diverse istruzioni di bassa utilità dalle generazioni precedenti. Quelle istruzioni sono ancora parte del set di istruzioni M68k per scopi di compatibilità binaria, ma sollevano un'eccezione sul 68060 e sono emulate in software dal M68060 Software Package (M68060SP) — 68060.lib (integer) e 68060f.lib (floating-point).
Istruzioni intere non implementate (M68060SP 68060.lib)¶
Per MC68060UM Appendix C.2, le seguenti istruzioni del 68020/68030/68040 sono non implementate nell'hardware del 68060:
| Mnemonic | Operazione | Forma emulata |
|---|---|---|
DIVU.L <ea>,Dr:Dq |
Divisione senza segno 64÷32→32r,32q | forma wide-input (dividendo 64 bit) |
DIVS.L <ea>,Dr:Dq |
Divisione con segno 64÷32→32r,32q | forma wide-input (dividendo 64 bit) |
DIVUL.L <ea>,Dr:Dq |
Divisione senza segno 32÷32→32r,32q | forma long (output 64 bit) |
DIVSL.L <ea>,Dr:Dq |
Divisione con segno 32÷32→32r,32q | forma long (output 64 bit) |
MULU.L <ea>,Dr:Dq |
Moltiplicazione senza segno 32×32→64 | forma wide-output (risultato 64 bit) |
MULS.L <ea>,Dr:Dq |
Moltiplicazione con segno 32×32→64 | forma wide-output (risultato 64 bit) |
MOVEP Dx,(d16,Ay) |
Sposta dati periferici → memoria | entrambe le direzioni |
MOVEP (d16,Ay),Dx |
Sposta dati periferici → registro | entrambe le direzioni |
CHK2 <ea>,Rn |
Controlla registro contro limiti | qualsiasi dimensione |
CMP2 <ea>,Rn |
Confronta contro limiti | qualsiasi dimensione |
CAS2 Dc1:Dc2,Du1:Du2,(Rn1):(Rn2) |
Confronta-e-scambia dual | qualsiasi dimensione |
CAS Dc,Du,<ea> (misaligned) |
Confronta-e-scambia con ea misaligned |
condizione di allineamento |
Tutte queste sollevano l'eccezione vettore 61 (istruzione intera non implementata). L'handler di eccezione legge il PC in stack, decodifica l'istruzione, la emula usando istruzioni implementate, e riprende via RTE.
Regola: qualsiasi forma di moltiplicazione o divisione wide (input OR output è 64 bit) è non implementata sul 68060. Le forme non-wide di MULS.L / MULU.L / DIVS.L / DIVU.L (es. MULS.L <ea>,Dl che restituisce risultato 32 bit in Dl, DIVS.L <ea>,Dq che restituisce quoziente 32 bit in Dq) sono implementate in hardware. Le forme wide che producono un risultato 64 bit tramite coppia di registri (Dh:Dl per MUL, Dr:Dq per DIV, incluse DIVSL.L e DIVUL.L il cui risultato occupa Dr:Dq) sono tutte emulate.
MOVEP è emulabile sul 68060 via M68060SP per MC68060UM Appendix C.2 (l'implementazione solleva l'eccezione vettore 61 e l'handler di eccezione M68060SP emula l'istruzione). Non è pienamente rimossa dall'ISA del 68060.
Istruzioni floating-point non implementate (M68060SP 68060f.lib)¶
Per MC68060UM Section 6.5.1 (Table 6-11), il 68060 non implementa le seguenti istruzioni FPU di 68881/68882/68040 — sollevano il vettore 11 (F-line non implementata):
| Categoria | Mnemonici |
|---|---|
| Trascendentali monadiche | FACOS, FASIN, FATAN, FATANH, FCOS, FCOSH, FETOX, FETOXM1, FGETEXP, FGETMAN, FLOG10, FLOG2, FLOGN, FLOGNP1, FSIN, FSINCOS, FSINH, FTAN, FTANH, FTENTOX, FTWOTOX |
| Aritmetica diadica / correlata | FMOD, FREM, FSCALE |
| Varie | FMOVECR, FTRAPcc, FDBcc, FScc |
Le seguenti forme di effective-address sono una classe separata: FMOVEM.X con lista di registri dinamica, FMOVEM.L maschere immediate selezionanti registri di controllo multipli, e forme sorgente immediate extended/packed. Queste generano l'eccezione effective-address non implementata (vettore 60) piuttosto che il percorso floating-point-unimplemented-instruction sul vettore 11.
La FPU è ancora integrata on-die sul 68060, e le seguenti restano implementate in hardware: FABS, FADD, FBcc, FCMP, FDIV, FINT, FINTRZ, FMOVE (la maggior parte delle forme), FMOVEM (la maggior parte delle forme), FMUL, FNEG, FNOP, FRESTORE, FSAVE, FSGLDIV, FSGLMUL, FSQRT, FSUB, FTST. FSCALE non è in questa lista nativa; è una delle operazioni floating-point non implementate.
FINT e FINTRZ sono documentate sia per il MC68881 che per il MC68882 e sono implementate nell'hardware MC68060. Sul MC68040 sono parte dell'ISA floating-point compatibile ma non sono implementate dalla FPU on-chip; software come M68040FPSP le fornisce attraverso il percorso di eccezione floating-point non implementata.
MMU e cache sul 68060¶
La famiglia 68060 ha tre varianti che differiscono per presenza di MMU e FPU:
| Variante | MMU | FPU | Note |
|---|---|---|---|
| MC68060 | ✅ on-die | ✅ on-die | parte completa |
| MC68LC060 ("Low Cost") | ✅ on-die | ❌ (no FPU) | le istruzioni FP legali richiedono il percorso di eccezione floating-point/supporto-software |
| MC68EC060 ("Embedded Controller") | ❌ nessuna MMU on-die | ❌ (no FPU) | variante embedded senza la MMU o FPU integrata |
Il MC68060 e il MC68LC060 hanno entrambi una MMU on-die configurata attraverso i registri di controllo stile 68040/68060. Il MC68EC060 omette la MMU integrata; il software deve trattarlo come una variante senza MMU piuttosto che assumere un'interfaccia PMMU esterna standard.
Mask set del 68060 (per verifica community)¶
Per la lista mantenuta dalla community (compilata da fonti multiple incluso l'Amiga past originale), le seguenti revisioni di mask del 68060 sono documentate:
| Mask | Revisione | MMU | FPU | Geometry [µm] | max speed osservata [MHz] | Nota |
|---|---|---|---|---|---|---|
| D11W | 1 | ✅ | — | 0.5 | 50 | prototipo raro |
| F43G | 1 | ✅ | — | 0.5 | 66 | Spesso trovato in chip marchiati 68EC060 |
| F84W | -- | -- | -- | 0.0 | 0 | Chip falso venduto come Rev.6 |
| F10H | -- | -- | -- | 0.0 | 0 | Chip falso venduto come Rev.6 |
| G65V | 5 | ✅ | — | 0.5 | 75 | Spesso trovato in chip marchiati 68EC060 |
| G59Y | 4 | ✅ | — | 0.42 | 100 | Qualificazione MC completa |
| E41J | 6 | ✅ | — | 0.42 | 100 | Qualificazione MC completa |
Il MC68060/MC68LC060 completi implementano la famiglia PFLUSH (PFLUSH, PFLUSHN, PFLUSHA, PFLUSHAN) per i loro ATC on-die. PTEST non è implementata sul 68060; PLPA (carica indirizzo fisico) fornisce un'alternativa orientata a diagnostica/table-walk. Il MC68EC060 non ha MMU, quindi gli opmode specifici MMU hanno comportamento variante-specifico e non devono essere descritti come il comportamento del MC68060 completo.
La famiglia MC68060 mantiene cache istruzioni e dati separate on-chip (8 KiB ciascuna sul design MC68060 completo); il comportamento di controllo cache dovrebbe essere verificato contro la documentazione esatta della variante LC/EC quando si scrive codice di sistema a basso livello.
Il 68060 mantiene le istruzioni di controllo cache CINV e CPUSH del 68040 per gestire la sua cache istruzioni 8 KB on-die + cache dati 8 KB (il 68060 ha pipeline superscalari dual-issue unificate).
Modello di esecuzione superscalare¶
Il 68060 è l'unico 680x0 classico con esecuzione superscalare dual-issue. Il suo core di esecuzione integer contiene una primary Operand Execution Pipeline (pOEP) e una secondary Operand Execution Pipeline (sOEP). L'accoppiamento delle istruzioni dipende dalla classificazione superscalare in MC68060UM Section 10, dalle dipendenze tra operandi, e dalle restrizioni delle modalità di indirizzamento:
- pOEP-only: istruzioni che richiedono la pipeline primaria o altrimenti bloccano l'accoppiamento
- pOEP / sOEP eligible: operazioni intere semplici e movimenti che soddisfano le regole di accoppiamento del manuale
- pOEP while allowing sOEP activity: branch selezionati/casi FPU e altre classi esplicitamente identificate dalle tabelle di timing
- Barriere di accoppiamento / classi multi-cycle: operazioni identificate dal manuale come bloccanti o che occupano risorse necessarie alla pipeline secondaria. Non inferire una barriera solo dal fatto che un'istruzione cambia il CCR; usa la classificazione pOEP/sOEP e le regole di dipendenza.
Il codice compilato che rispetta queste barriere può vedere ~1.5–1.8× il throughput per clock vs. 68040. La comunità di sviluppatori AmigaOS (PhxASS vbcc) aveva pragma di scheduling specifici per emettere coppie di istruzioni dual-issue-friendly.
Pacchetto M68060SP¶
Il M68060 Software Package (M68060SP) è il pacchetto di supporto software Motorola/Freescale per la compatibilità MC68060. Fornisce routine di supporto integer e floating-point, inclusi handler/librerie per le operazioni non implementate:
68060.lib— emulazione istruzioni intere (sollevata sul vettore di eccezione 61)68060f.lib— emulazione istruzioni FPU (sollevata sul vettore 11)- File header
m68060.h(vettori di eccezione, formati frame, definizioni di struct)
Motorola/Freescale distribuì l'M68060SP separatamente come pacchetto software di integrazione di sistema; la disponibilità e l'integrazione in specifici sistemi operativi o toolchain è platform-dependent.
Sui sistemi Amiga con acceleratore 68060, il software di supporto CPU della scheda/OS normalmente installa gli handler di eccezione richiesti durante l'inizializzazione del sistema. I nomi esatti delle librerie e i dettagli di integrazione sono accelerator- e OS-distribution-specific, quindi il codice applicativo non dovrebbe assumere che una generica 68060.library sia universalmente presente o che essa faccia direttamente da wrapper per le librerie oggetto Motorola.
Semantica CAS2 e CAS sul 68060¶
CAS2(68020/030/040): completamente non implementata sul 68060 — emulata via68060.libCAS(allineata): implementata in hardwareCAScon un effective address misaligned: non implementata nell'hardware MC68060 e gestita attraverso il percorso di supporto-software del vettore 61 se un emulatore è installato
Il software non dovrebbe fare affidamento su CAS deliberatamente misaligned come tecnica di sincronizzazione portabile: il MC68060 tratta quella forma come un caso intero non implementato.
Riepilogo matrice di compatibilità¶
La famiglia è ampiamente object-code compatibile verso l'alto, ma non strettamente monotona: diverse istruzioni o forme di istruzione scompaiono dall'hardware sui processori successivi, e alcune sono recuperate attraverso supporto software guidato dalle eccezioni. I conteggi mnemonici sotto mantengono la convenzione di conteggio originale dell'articolo così che la progressione attraverso le generazioni di CPU resti visibile; le forme di istruzione che condividono un mnemonic non sono necessariamente contate separatamente. Per il MC68060, i mnemonici nativi e emulati software sono distinti esplicitamente.
| Metrica | 68000 | 68010 | 68020 | 68030 | 68040 | 68060 |
|---|---|---|---|---|---|---|
| Mnemonici totali (convenzione di conteggio dell'articolo) | 73 | 77 | 105 | 106 | 113 | 108 |
| Sottoinsieme compatibile 68000 | 73 | 73 | 73 | 73 | 73 | 73 |
| Nuovi mnemonici vs. predecessore | — | 4 | 28 | 1 | 7 | −5 |
| Implementati in hardware | 73 | 77 | 105 | 106 | 113 | 72 |
| Emulati | 0 | 0 | 0 | 0 | 27 | 36 |
Per il MC68060, i 36 gruppi mnemonici gestiti software in questa convenzione comprendono 8 gruppi interi (CMP2, CHK2, CAS2, MOVEP, DIVSL.L, DIVUL.L, MULS.L wide, MULU.L wide), 21 operazioni floating-point monadiche, 3 operazioni floating-point diadiche (FMOD, FREM, FSCALE), e 4 operazioni floating-point varie (FDBcc, FScc, FTRAPcc, FMOVECR). Questo è un riepilogo a livello di mnemonic; encoding/forme individuali addizionali come DIVS.L/DIVU.L wide, CAS misaligned, e forme restricted di floating-point effective-address fanno anch'esse trap per la gestione software.
| Transizione | Punti di compatibilità importanti |
|---|---|
| 68000 → 68010 | MOVE from SR diventa privilegiata; MOVE from CCR, BKPT, MOVEC, MOVES, e RTD sono aggiunte. |
| 68010 → 68020 | Modello di indirizzamento/bus a 32 bit, indirizzamento scalato e memory-indirect, bit-field, CAS/CAS2, CHK2/CMP2, PACK/UNPK, TRAPcc, moltiplicazione/divisione long, e istruzioni coprocessore sono aggiunte. |
| 68020 → 68030 | CALLM/RTM sono rimosse; istruzioni MMU integrate sono aggiunte; il resto dell'ISA integer mainstream del 68020 è mantenuto. |
| 68030 → 68040 | Il modello di programmazione MMU cambia; CINV, CPUSH, e MOVE16 sono aggiunte; una FPU hardware implementa un sottoinsieme comune 68881/68882 mentre FPSP fornisce il resto. |
| 68040 → 68060 | Esecuzione superscalare pOEP/sOEP; diverse forme intere (MOVEP, CAS2, CHK2, CMP2, MUL/DIV wide, CAS misaligned) e molte operazioni floating-point fanno trap per la gestione software; PTEST non è implementata e PLPA è aggiunta. |
Per il MC68060, i percorsi di eccezione chiave sono vettore 61 per istruzioni intere non implementate, vettore 60 per forme di effective-address non implementate, e vettore 11 per casi F-line floating-point non implementato/disabilitato.
Tabella vettori di eccezione (base + differenze chiave per CPU)¶
La tabella vettori M68k contiene 256 voci long-word. Sul MC68000 inizia all'indirizzo fisico $000000; sui processori con un Vector Base Register (MC68010+) la tabella può essere riposizionata.
Assegnazioni vettori base MC68000¶
| Vettore # | Offset | Assegnazione |
|---|---|---|
| 0 | $000 |
Reset SSP iniziale |
| 1 | $004 |
Reset PC iniziale |
| 2 | $008 |
Bus error |
| 3 | $00C |
Address error |
| 4 | $010 |
Illegal instruction |
| 5 | $014 |
Divisione intera per zero |
| 6 | $018 |
Istruzione CHK |
| 7 | $01C |
Istruzione TRAPV |
| 8 | $020 |
Privilege violation |
| 9 | $024 |
Trace |
| 10 | $028 |
Emulatore Line 1010 (A-line) |
| 11 | $02C |
Emulatore Line 1111 (F-line) |
| 12-13 | $030-$034 |
Riservati sul MC68000 |
| 14 | $038 |
Riservato sul MC68000; usato come format error sulle CPU successive |
| 15 | $03C |
Vettore interrupt non inizializzato |
| 16-23 | $040-$05C |
Riservati |
| 24 | $060 |
Spurious interrupt |
| 25-31 | $064-$07C |
Autovettori interrupt livello 1-7 |
| 32-47 | $080-$0BC |
TRAP #0 ... TRAP #15 |
| 48-63 | $0C0-$0FC |
Riservati sul MC68000 base |
| 64-255 | $100-$3FC |
Vettori definiti dall'utente |
MC68010 e successivi¶
Il MC68010 aggiunge la macchina VBR e restartable exception-frame. In particolare, il vettore 14 è il vettore format-error usato quando RTE incontra un formato di frame invalido. I processori successivi riutilizzano vettori precedentemente riservati addizionali per eccezioni specifiche FPU/MMU.
Vettori floating-point MC68040¶
Il MC68040 usa il vettore 11 per un'istruzione floating-point non implementata (anche il vettore F-line generico). Le eccezioni aritmetiche floating-point occupano i vettori 48-55; il vettore 55 è l'eccezione floating-point unimplemented-data-type. Le varianti senza FPU MC68LC040/MC68EC040 instradano anch'esse le istruzioni floating-point legali attraverso il percorso F-line/non implementata così che il software possa emularle.
Vettori istruzioni non implementate MC68060¶
Le assegnazioni MC68060 rilevanti per la compatibilità software sono:
| Vettore # | Assegnazione |
|---|---|
| 10 | Emulatore A-line / line-1010 non implementato |
| 11 | F-line non implementata, floating-point disabilitata, o istruzione floating-point non implementata |
| 55 | Tipo di dato floating-point non supportato |
| 60 | Effective address non implementata |
| 61 | Istruzione intera non implementata |
| 62-63 | Riservati / non assegnati |
Così il supporto software M68060 usa il vettore 61 per l'emulazione integer e il vettore 11 per l'emulazione floating-point/F-line; il vettore 60 gestisce le forme speciali di effective-address non implementate.
Mapping interrupt Amiga¶
Sull'hardware Amiga classico, i vettori CPU 25-31 sono semplicemente gli autovettori M68k standard livello 1-7. Il controller di interrupt custom-chip Amiga multiplexa le sorgenti di interrupt di sistema sui livelli 1-6; CIA-A contribuisce attraverso la sorgente livello-2 PORTS e CIA-B attraverso la sorgente livello-6 EXTER. Il livello 7 è il livello di interrupt non mascherabile e non è un "vettore CIA" dedicato. L'hardware di espansione dovrebbe usare i meccanismi di interrupt del sistema operativo piuttosto che assumere range di vettori fissi come 64-95 per dispositivi Zorro.
Conteggi cicli di clock¶
I conteggi cicli per istruzione variano per modalità di indirizzamento (il calcolo dell'effective-address aggiunge cicli) e per tipo di operando (registro vs memoria). Le tabelle sotto mostrano il conteggio cicli base caso migliore (tipicamente registro-a-registro o la modalità di indirizzamento più veloce) per ciascuna istruzione per CPU. Per le tabelle complete per-modalità vedi il corrispondente Manuale Utente Motorola:
- 68000/68010 — MC68000UM Table 8-1 → 8-9
- 68020 — MC68020UM Appendix A (tabelle cicli per-modalità)
- 68030 — MC68030UM Section 9 (tabelle cicli per-modalità)
- 68040 — MC68040UM Section 10 (tabelle cicli per-modalità)
- 68060 — MC68060UM Section 10 (Tables 10-6 → 10-25)
Conteggi cicli base 68000/68010 (per MC68000UM Table 8-1 → 8-9)¶
| Mnemonic | Caso migliore (regs) | Variante long | Note |
|---|---|---|---|
ABCD |
8 | forma Dx,Dy | |
ADD |
4 | 8 (long) | forma Dx,Dy |
ADDA |
8 | An + Dx | |
ADDI |
8 | 16 | #imm, Dx |
ADDQ |
4 | 8 | #imm, Dx |
ADDX |
4 | 8 | forma Dx,Dy |
AND |
4 | 8 | forma Dx,Dy |
ANDI |
8 | 16 | #imm, Dx |
ASL ASR |
6+2n | fino a 14 | shift registro per registro |
Bcc |
10 (presa) / 8 (non presa) | ||
BCHG BCLR BSET BTST (reg) |
8-12 | forma Dx | |
BRA |
10 | ||
BSR |
18 | ||
BTST (imm) |
8-12 | ||
CHK |
10+ (trap se fallisce) | ||
CLR |
4-6 | 6-8 | forma Dx |
CMP |
4 | 6 | forma Dx,Dy |
CMPA |
6 | ||
CMPI |
8 | 12 | #imm, Dx |
CMPM |
12 | 20 | (Ay)+, (Ax)+ |
DBcc |
10-16 (presa/non-presa) | ||
DIVS DIVU |
158 (word) / fino a 170 (long) | altamente variabile | |
EOR |
4 | 8 | forma Dx,Dy |
EORI |
8 | 16 | #imm, Dx |
EXG |
6 | ||
EXT.W |
4 | ||
EXT.L |
4 | ||
ILLEGAL |
34 | ||
JMP |
8 | forma (An) | |
JSR |
16 | forma (An) | |
LEA |
4 | forma (An) | |
LINK |
16 | ||
LSL LSR |
6+2n | fino a 14 | |
MOVE |
4 | 4 | Dx,Dy (reg-a-reg) |
MOVE |
8 (byte/word) / 12 (long) | (An)+ a (An)+ | |
MOVE to/from SR/CCR/USP |
8-12 | supervisore | |
MOVEA |
4 | 4 | |
MOVEM |
12+4n (n registri) | fino a 36 | reg-a-mem |
MOVEP |
16 | 24 | (d16,Ay), Dx |
MOVEQ |
4 | ||
MULS MULU |
38 (word) / 38+ (long) | 38-70 | |
NBCD |
8 | forma Dx | |
NEG |
4 | 6 | forma Dx |
NEGX |
4 | 6 | forma Dx |
NOP |
4 | ||
NOT |
4 | 6 | forma Dx |
OR |
4 | 8 | |
ORI |
8 | 16 | |
PEA |
12 | forma (An) | |
RESET |
132 | ||
ROL ROR ROXL ROXR |
6+2n | fino a 14 | |
RTD |
16 | 68010+ | |
RTE |
20 | ||
RTR |
20 | ||
RTS |
16 | ||
SBCD |
8 | ||
Scc |
4-8 | 8-10 | |
STOP |
4 | ||
SUB |
4 | 8 | |
SUBA |
8 | ||
SUBI |
8 | 16 | |
SUBQ |
4 | 8 | |
SUBX |
4 | 8 | |
SWAP |
4 | ||
TAS |
4 (reg) / 10 (mem) | ||
TRAP |
34 | ||
TRAPV |
34 | ||
TST |
4 | 4 | |
UNLK |
12 |
Conteggi cicli base 68020 (per MC68020UM Appendix A)¶
| Mnemonic | Caso migliore (regs) | Note |
|---|---|---|
ABCD SBCD NBCD |
6 | forma Dx,Dy |
ADD SUB |
4 | forma Dx,Dy |
ADDQ SUBQ |
4 | #imm, Dx |
ADDX SUBX |
4 | forma Dx,Dy |
ADDI SUBI ANDI ORI EORI CMPI |
8 | #imm, Dx |
AND OR EOR CLR NEG NOT TST NEGX |
4 | forma Dx,Dy |
ADDA SUBA CMPA |
8 | |
CMP |
4 | forma Dx,Dy |
MULS.W MULU.W MULS.L MULU.L |
28 (word) / 44 (long) | caso migliore, no early-out |
DIVS.W DIVU.W |
44 | word divide, caso peggiore |
DIVS.L DIVU.L |
92 (best) / 158 (worst) | long divide |
DIVSL.L DIVUL.L |
96-168 | forma 64÷32 |
EXG |
6 | |
EXT.W EXT.L EXTB.L |
4 | |
SWAP |
4 | |
ASL ASR LSL LSR ROL ROR ROXL ROXR |
6+2n | fino a 14 (per conteggio) |
Bcc |
10 (presa) / 8 (non) | BCHG su 68020 mette in cache i target |
BRA |
10 | |
BSR |
18 | |
BCHG BCLR BSET BTST (reg) |
8-12 | |
BFCHG BFCLR BFSET BFTST |
12-18 | 68020+ |
BFEXTS BFEXTU BFINS BFFFO |
12-18 | 68020+ |
CHK CHK2 CMP2 |
8+ cicli (trap) | 68020+ CHK2/CMP2 |
CAS CAS2 |
12+ | 68020+ |
CLR |
4 | reg |
DIVS DIVU |
44 (word) / 92-158 (long) | variabile |
EXT |
4 | |
ILLEGAL |
20 | |
JMP (An) |
8 | |
JSR (An) |
16 | |
LEA (An) |
4 | |
LINK |
16 | |
MOVE |
4 | Dx,Dy (reg-a-reg) |
MOVE (long) |
8 | memoria-a-memoria |
MOVEC |
12 | supervisore, 68010+ |
MOVEM |
12+4n (n registri) | fino a 36+ |
MOVEP |
16 (word) / 24 (long) | 68020+ in formato diverso |
MOVEQ |
4 | |
MULS MULU |
28-44 | |
NBCD |
8 | |
NEG NEGX NOT TST |
4 | |
NOP |
4 | |
OR EOR AND |
4 | |
ORI ANDI EORI |
8 (word) / 16 (long) | |
PACK UNPK |
8 | 68020+ |
PEA |
12 | |
RESET |
132 | |
ROL ROR ROXL ROXR |
6+2n | |
RTD |
16 | 68010+ |
RTE |
20 | |
RTR |
20 | |
RTS |
16 | |
Scc |
4-8 | |
STOP |
4 | |
SUB |
4 | |
SWAP |
4 | |
TAS |
4 (reg) / 14 (mem) | |
TRAP |
34 | |
TRAPcc |
18+ | 68020+ |
TRAPV |
34 | |
TST |
4 | |
UNLK |
12 |
Conteggi cicli base 68030 (per MC68030UM Section 9)¶
Il 68030 generalmente eguaglia i cicli del 68020 per operandi registro, ma le cache integrate riducono significativamente i conteggi cicli effettivi per accessi in memoria (cache hit: 0 cicli extra; cache miss: penalty aggiunta per MC68030UM §9).
| Mnemonic | Caso migliore (regs) | Note |
|---|---|---|
| Tutte le op ALU registro-registro | stesso del 68020 | cache abilitata |
MOVE (memoria, cache hit) |
4 | no wait state |
MOVE (memoria, cache miss) |
8+ (penalty bus) | dipende dalla velocità della memoria |
MOVEM |
più veloce del 68020 | fill cache in modalità burst |
PMOVE PFLUSH PTEST PLOAD |
12-30 cicli | 68030-specifico |
MULS.L MULU.L |
28-44 cicli | stesso del 68020 |
Conteggi cicli base 68040 (per MC68040UM Section 10)¶
Il 68040 usa una pipeline integer a 6 stadi (IF, ID, EA, EX1, EX2, EX3, WB) con cache istruzioni e dati separate, una branch cache, e una FPU integrata. Il formato di timing è L + X dove L = lead time (cicli per cui l'istruzione può stallare) e X = cicli di esecuzione base. La tabella sotto dà il conteggio cicli base caso migliore (tipicamente registro-a-registro, operando Dn) per ciascuna istruzione, che è anche ciò che l'unità integer può sostenere nella pipeline a 1 IPC. I cicli di calcolo dell'effective-address (0-3 per Table 10-2) devono essere aggiunti per operandi non-registro.
Aritmetica interi¶
| Mnemonic | Caso migliore (regs) | Note |
|---|---|---|
ADD SUB AND OR EOR TST (D→D) |
1 | registro-a-registro |
ADD SUB (D→M) |
1 | destinazione memoria |
ADDA SUBA (D→A) |
2 | (M68040UM Table 10-6) |
ADDI SUBI ANDI ORI EORI (reg) |
1 | |
ADDQ SUBQ (reg) |
1 | |
ADDX SUBX (D→D) |
1 | |
ADDX SUBX (M→M) |
3 (predecrement); 4 (regolare) | |
CLR (D→D) |
1 | |
CLR (D→M) |
1 | destinazione memoria |
CMP (D→D) |
1 | |
CMPA (D→A) |
2 | |
CMPI (reg) |
1 | |
CMPM |
1 | postincremento |
NEG NOT NEGX (D→D) |
1 | |
TST (D→D) |
1 | |
EXT.W EXT.L EXTB.L |
1 | |
SWAP |
1 | |
MULS.W MULU.W |
2 | moltiplicazione word |
MULS.L MULU.L (32×32→32) |
3 | moltiplicazione long |
MULS.L wide MULU.L wide (32×32→64) |
4 | |
DIVS.W DIVU.W |
≤18 (variabile) | word divide, condizionale |
DIVS.L DIVU.L (32÷32→32q) |
≤44 (variabile) | long divide |
DIVS.L wide DIVU.L wide (64÷32→32r:32q) |
8-44 (peggiore) | |
DIVSL.L DIVUL.L (32÷32→32r:32q) |
4-44 (peggiore) | |
Op BCD (ABCD, SBCD, NBCD) (D→D) |
3 | |
Op BCD (M→M) |
3 (o 3L+1 per alcune forme) | |
NEGX.S NEGX.B |
1 | |
MOVE (D→D) |
1 | |
MOVE (D→M, byte/word) |
1 | destinazione memoria |
MOVE (D→M, long) |
1 | |
MOVEA (D→A) |
1 | |
MOVEQ |
1 | |
EXG |
1 | registro-registro |
Logiche¶
| Mnemonic | Caso migliore (regs) | Note |
|---|---|---|
AND OR EOR (D→D) |
1 | |
ANDI ORI EORI (D→D) |
1 | |
NOT (D→D) |
1 | |
EXG |
1 |
Manipolazione bit¶
| Mnemonic | Caso migliore (regs) | Note |
|---|---|---|
BCHG BCLR BSET (D→D) |
1 | |
BCHG BCLR BSET (M→M) |
1 (write-back) | atomica per BSET/BCLR |
BTST (D→D) |
1 | |
BTST (M) |
1 (no write-back) |
Bit-field (68020+)¶
| Mnemonic | Caso migliore (regs) | Note |
|---|---|---|
BFCHG BFCLR BFSET BFTST (reg) |
1-2 | 68040 pipeline BF bene |
BFEXTS BFEXTU BFINS BFFFO |
1-2 | |
PACK UNPK (D→D) |
1 |
Shift/rotazioni¶
| Mnemonic | Caso migliore (regs) | Note |
|---|---|---|
ASL ASR LSL LSR (D→D, per registro) |
1 + 1/ciclo shift | fino a 5 per byte, 17 per long |
ASL ASR LSL LSR (D→D, immediato) |
1 (word) / 1 (long, ≤8) / 2 (long, >8) | |
ROL ROR ROXL ROXR (D→D, per registro) |
1 + 1/ciclo | fino a 5 (byte) / 17 (long) |
ROL ROR ROXL ROXR (D→D, immediato) |
1-2 |
Controllo di programma¶
| Mnemonic | Caso migliore | Note |
|---|---|---|
Bcc (predetta correttamente) |
1 | branch cache hit |
Bcc (predetta, non presa) |
1 | dual-issue con successiva |
Bcc (predetta, presa) |
1 | |
Bcc (non predetta) |
3-5 | branch cache miss |
BRA (presa) |
4 | |
BSR |
7 | |
DBcc (count ≥ 0) |
4 | |
DBcc (presa) |
7 | |
JMP (An) |
4 | |
JMP (d16,An) |
4 | |
JMP (d8,An,Xn) |
6 | |
JSR (An) |
5 | |
JSR (d16,An) |
5 | |
JSR (d8,An,Xn) |
7 | |
LEA (An) |
1 | la più veloce di tutte |
LEA (d16,An) |
1 | |
LEA (d8,An,Xn) |
3 | |
RTS |
5 | |
RTR |
7 | |
RTE (Formato $0) |
13 | throwaway 68020+ |
RTE (Formato $1) |
23 | bus cycle restart |
RTE (Formato $2) |
14 | |
RTE (Formato $3) |
20 | |
RTD |
6 | 68010+ |
JMP (d16,PC) |
5 | |
JSR (d16,PC) |
6 | |
NOP |
1 | un ciclo (equivalente TRAPF) |
TRAP #n |
16 | trap + fetch vettore |
TRAPcc (presa) |
19 | |
TRAPcc (non presa) |
5 | |
TRAPV (presa) |
19 | |
TRAPV (non presa) |
5 | |
LINK |
5 | |
UNLK |
2 | |
BKPT |
10+ (ack BKPT) | 68010+ |
Sistema / privilegiate¶
| Mnemonic | Caso migliore | Note |
|---|---|---|
ILLEGAL |
14 | |
RESET |
521 | timing reset esterno 68040 |
RTE (vedi Controllo programma) |
13-23 | per formato stack |
STOP |
1 (poi idle) | |
ANDI ORI EORI a SR/CCR |
8 (1L+7) | 68000-compatibile |
MOVE to/from SR |
3 (1L+2) / 5 (1L+4) | |
MOVE to/from CCR |
3 | |
MOVE USP |
3 | 68010+ |
MOVEC |
4 (1L+3) | 68010+ |
MOVES |
7 (1L+6) | 68010+ |
MOVEM (reg→mem) |
4+1/n (best) | 12+4n per mem→reg su 68000; su 68040: 4-9 cicli |
MOVEP |
4-8 (word/long) | solo 68000 |
TAS (reg) |
1 | 68000 atomico anche su 68040 (locked transfer) |
TAS (mem) |
4+ | con locked bus transfer |
BKPT |
10+ | 68010+ |
Atomiche (68020+)¶
| Mnemonic | Caso migliore | Note |
|---|---|---|
CAS (allineata) |
1-3 | atomica; 1 in cache, 3 con bus locked transfer |
CAS2 |
1-5 | solo 68020/30 (rimossa su 68040?) — in realtà ancora supportata, 5-7 cicli |
CHKVAR2 |
(variante) |
MMU (PMMU 68030, MMU interna 68040)¶
| Mnemonic | Caso migliore | Note |
|---|---|---|
PFLUSH (An) |
11 (1L+10) | svuota una voce |
PFLUSHA |
11 (1L+10) | svuota una (ATC miss) |
PFLUSHAN |
27 (1L+26) | svuota tutte + invalida |
PFLUSHN (An) |
11 (1L+10) | svuota una, no invalidate |
PTESTR PTESTW |
25 (11L+14) | ricerca tabella 3-livelli, no scritture descrittore, memoria 4-clock |
Cache (68040+)¶
| Mnemonic | Caso migliore | Note |
|---|---|---|
CINV |
4-12 (per linea) | invalida linea/e di cache |
CPUSH |
4-12 (per linea) | spedisci + invalida |
MOVE16 (68040+)¶
| Mnemonic | Caso migliore | Note |
|---|---|---|
MOVE16 (An)+ → (An)+ |
8 (1L+7) prima; +8 per successiva | trasferimento burst allineato a linea |
MOVE16 (An)+ → (xxx).L |
8 (1L+7) | |
MOVE16 (xxx).L → (An)+ |
8 (1L+7) | |
MOVE16 (cache hit) |
11-8=3 per linea (1L+2) | sia sorgente che dest in cache |
Floating-point (set istruzioni 68882 su FPU integrata)¶
Per MC68040UM §10.7 (Floating-Point Unit Instruction Timings), la FPU integrata esegue le istruzioni in parallelo con l'unità integer quando l'unità integer non ha accessi in memoria pendenti. I tempi dipendono dal formato dati e tipo di operando:
| Operazione FPU | Reg-Reg (W) | Reg-Reg (D) | Reg-Reg (X) | Reg-Mem | Mem-Reg |
|---|---|---|---|---|---|
FADD FSUB |
4 | 4 | 5 | 8 | 8 |
FMUL |
4 | 5 | 6 | 9 | 9 |
FDIV |
24 | 38 | 56 | 32 | 32 |
FSQRT |
56 | 56 | 80 | 64 | 64 |
FABS FNEG FTST FCMP |
2 | 2 | 3 | 6 | 6 |
FMOVE.X |
2 | 2 | 2 | 4 (mem read) | 4 (mem write) |
FMOVE.P |
12 | 12 | 12 | 12 (write) | 16 (read) |
FINT FINTRZ |
3 | 3 | 4 | 6 | 6 |
FMOVECR |
5 | 5 | 5 | — | — |
FSIN FCOS FTAN |
56 | 56 | 80 | 60 | 60 |
FSINCOS |
100 | 100 | 120 | 110 | 110 |
FLOG10 FLOG2 FLOGN |
60 | 60 | 80 | 60 | 60 |
FLOGNP1 |
80 | 80 | 100 | 80 | 80 |
FETOX |
56 | 56 | 80 | 60 | 60 |
FETOXM1 |
80 | 80 | 100 | 80 | 80 |
FTENTOX FTWOTOX |
56 | 56 | 80 | 60 | 60 |
FSQRT (solo 68882) |
56 | 56 | 80 | 60 | 60 |
FMOD FREM |
100 | 100 | 100 | 100 | 100 |
FSAVE |
22 | 22 | 22 | 22 | — |
FRESTORE |
25 | 25 | 25 | — | 25 |
FBcc (presa) |
10 | 10 | 10 | 10 | 10 |
FBcc (non presa) |
8 | 8 | 8 | 8 | 8 |
FDBcc |
varia | varia | varia | varia | varia |
FScc (false) |
1 | 1 | 1 | 6 | 6 |
FScc (true) |
1 | 1 | 1 | 6 | 6 |
FTRAPcc (presa) |
10 | 10 | 10 | 10 | 10 |
FTRAPcc (non presa) |
8 | 8 | 8 | 8 | 8 |
FNOP |
8 | 8 | 8 | 8 | 8 |
FMOVEM |
8 (1L+7) + 1 per reg | prima mossa + 1 per reg | fino a 16 reg |
La FPU 68040 esegue l'aritmetica FP di base in hardware; le trascendentali, FMOVECR, e FDBcc/FScc/FTRAPcc sono emulate tramite il pacchetto M68040FPSP (i conteggi cicli sopra sono i timing osservabili dall'utente, inclusa l'emulazione). Sul 68060 lo stesso set è emulato tramite m68060f.lib.
Riepilogo 68040: perché è veloce¶
Il drammatico speedup del 68040 rispetto al 68020/68030 viene da tre cose: 1. Pipeline a 6 stadi — issue a singolo ciclo per la maggior parte delle op registro-registro 2. Branch cache — branch predetti correttamente sono 1 ciclo (penalty branch zero su hit) 3. FPU + MMU integrate — possono girare in parallelo con l'unità integer; le istruzioni FPU non bloccano la pipe integer
Quindi mentre il conteggio cicli caso migliore per un'op ALU è 1 ciclo su 68000/68010/68020/68030/68040/68060, il throughput medio in un loop stretto è: - 68000/010/020/030: ~4-8 IPC = ~0.1-0.25 IPC/watt - 68040: 1 IPC per op registro, più esecuzione FPU/MMU parallela - 68060: 2 IPC (dual-issue integer) quando l'accoppiamento delle istruzioni ha successo
Per MC68060UM §10, il 68060 sostiene 1.5–1.8 IPC per codice ben schedulato (vedi la colonna classificazione pipe 68060 sopra per quali istruzioni fanno dual-issue).
Conteggi cicli base 68060 (per MC68060UM Section 10)¶
| Mnemonic | Caso migliore (regs) | Varianti long/word | Note |
|---|---|---|---|
ADD AND OR EOR SUB SUBI ADDI ANDI ORI EORI |
1 ciclo | stesso per tutte le dimensioni | Dn+Dn = 1(0/0) |
ADDQ SUBQ |
1 ciclo | stesso | registro-a-registro |
ADDA SUBA CMPA MOVEA |
1 ciclo | stesso | |
CMP CMPI CMPA |
1 ciclo | stesso | |
MOVE |
1 ciclo (1(0/0) per reg-a-reg) | MOVE.L con memoria aggiunge 0-1 cicli | |
MOVEQ |
1 ciclo | ||
MULS.W MULU.W |
2 cicli (1(1/0)) | moltiplicazione word | |
MULS.L MULU.L |
2 cicli (1(1/0)) | moltiplicazione long (non-wide) | |
MULS.L wide MULU.L wide |
38+ cicli | emulata su 68060 | risultato 64 bit |
DIVS.W DIVU.W |
≤22 cicli (variabile) | 1(1/0) base + variabile | divisione word, condizionale |
DIVS.L DIVU.L |
38 cicli (1(1/0) base + 37) | divisione long (non-wide) | |
DIVSL.L DIVUL.L |
emulata (m68060.lib) | output 64 bit | |
NEG NOT NEGX |
1 ciclo | 1(0/0) per reg | |
CLR |
1 ciclo | 1(0/0) per reg | |
TST |
1 ciclo | 1(0/0) per reg | |
EXT.W EXT.L |
1 ciclo | ||
EXTB.L |
1 ciclo | 68020+ | |
SWAP |
1 ciclo | ||
ASL ASR LSL LSR |
1+3n (n=conteggio shift) | fino a 8 cicli per shift registro | |
ROL ROR ROXL ROXR |
1+3n | fino a 8 cicli | |
BCHG BCLR BSET BTST (registro) |
1-3 cicli | destinazione memoria aggiunge | |
Bcc (predetta) |
1 ciclo (dual-issue) | ||
Bcc (non predetta) |
3-5 cicli | ||
BRA BSR |
3-4 cicli | ||
JMP (An) |
1 ciclo | ||
JSR (An) |
3 cicli | ||
RTS |
4 cicli | ||
RTR |
7 cicli | ||
JSR (d16,An) |
4 cicli | ||
LEA (An) |
1 ciclo | ||
LEA (d16,An) |
2 cicli | ||
PEA (An) |
2 cicli | ||
LINK |
4 cicli | ||
UNLK |
3 cicli | ||
NOP |
1 ciclo | ||
TRAP #n |
14 cicli | ||
STOP |
varia | ||
RTE |
8 cicli | ||
RESET |
519 cicli | ||
MOVE16 |
18 cicli (1(1/1)) per trasferimento linea; 11(1/1) se lettura hit cache | ||
TAS |
1 ciclo (reg) / 17 cicli (memoria) | ||
CHK CHK2 |
8+ cicli (trap se fuori limiti) | ||
TRAPcc TRAPV |
5+ cicli | nativa su 68060 (1(0/0) per Table 10-24; gestione trap aggiunge cicli quando presa) | |
BCHG BSET BCLR (memoria) |
4-7 cicli | ||
BFCHG BFCLR BFSET BFTST |
4-7 cicli | bit-field 68020+ | |
BFEXTS BFEXTU BFINS BFFFO |
4-7 cicli | 68020+ | |
PACK UNPK |
4-7 cicli | nativa su 68060 (2(0/0) registro / 2(1/1) memoria per Table 10-24) | |
CMP2 |
4-7 cicli | emulata su 68060 | |
CAS |
19 cicli (1(1/1)) | 68020+ | |
CAS2 |
emulata su 68060 | solo 68020+ | |
MOVEM |
3-12 cicli a seconda del conteggio | ||
MOVEC |
6+ cicli | supervisore 68010+ | |
MOVES |
8+ cicli | supervisore 68010+ | |
MOVE from SR |
3 cicli (1(0/0)) | 68000 non privilegiata; 68010+ privilegiata | |
MOVE to SR |
4 cicli (1(0/0)) | supervisore | |
MOVE to CCR |
4 cicli (1(0/0)) | ||
MOVE from CCR |
3 cicli (1(0/0)) | ||
MOVE USP |
3 cicli | supervisore | |
ANDI ORI EORI a SR/CCR |
8-10 cicli | supervisore | |
BKPT |
10+ cicli (ack BKPT) | ||
CINV CPUSH |
4+ cicli per linea | 68040+ | |
PFLUSH |
1 ciclo (NOP per MC68060UM §1.1.2.2) | emulata, mantenuta dal 68030/68040 | |
PLPA |
4+ cicli | solo 68060 |
I conteggi cicli per il 68060 in questa tabella sono derivati da MC68060UM Section 10.2 (Assunzioni di Timing: tutte le istruzioni e dati risiedono nella cache operandi, nessun bus error, nessuna traduzione MMU, ICache hit). Sono i cicli base che devono essere aggiunti ai tempi di calcolo dell'effective-address di Table 10-5 (tipicamente 0-3 cicli a seconda della modalità di indirizzamento). Il 68060 usa predizione di branch dinamica; i branch predetti correttamente sono 1 ciclo (dual-issue con l'istruzione successiva), i branch mispredetti sono 8-9 cicli.
Conteggi cicli FPU 68881/68882 (per datasheet MC68881/MC68882)¶
I conteggi cicli FPU dipendono dal formato dati, tipo sorgente/destinazione, e operazione. Valori tipici:
| Operazione FPU | 68881 (cicli tipici) | 68882 (cicli tipici, ~1.5×) |
|---|---|---|
FADD.S FADD.D FADD.X (reg, reg) |
4 / 4 / 6 | 3 / 3 / 4 |
FSUB.S FSUB.D FSUB.X |
4 / 4 / 6 | 3 / 3 / 4 |
FMUL.S FMUL.D FMUL.X |
7 / 8 / 10 | 4 / 5 / 6 |
FDIV.S FDIV.D FDIV.X |
36 / 70 / 102 | 24 / 47 / 68 |
FSQRT.S FSQRT.D FSQRT.X |
70 / 70 / 102 | 47 / 47 / 68 |
FABS FNEG |
3 | 2 |
FTST |
3 | 2 |
FCMP |
3 / 3 / 5 | 2 / 2 / 3 |
FMOVE.X <ea>,FPn |
3 (reg) / 4 (mem) | 2 / 3 |
FMOVE.P |
12 | 8 |
FINT FINTRZ |
55 (FPn→FPm, 68881); 82/74/80/78/892 per Int/S/D/X/P per Table 8-2 | 58 Totale (68882 FPn→FPm) per Table 8-3 |
FMOVECR |
29 (FPn→FPm, 68881; nessun operando memoria) per Table 8-2 | 32 Totale (68882 FPn→FPm) per Table 8-3 |
FSIN FCOS FSQRT (trascendentali 68881/68882) |
391 / 391 / 107 (68881 FPn→FPm); 1228 / 1228 / 944 Packed per Table 8-2 | 394 / 394 / 110 Totale (68882 FPn→FPm) per Table 8-3 |
FLOG2 FLOG10 FLOGN (68881/68882) |
581 / 581 / 525 (68881 FPn→FPm); 1418 / 1418 / 1352 Packed per Table 8-2 | 584 / 584 / 528 Totale (68882 FPn→FPm) per Table 8-3 |
FSAVE / FRESTORE |
22 / 25 | 14 / 17 |
Per le tabelle complete per-formato vedi MC68881 Technical Summary (alldatasheet 1985) e MC68882 Technical Summary (alldatasheet 1990), entrambi nell'archivio wiki.
Note semantiche¶
MOVE from SR— Sul 68000 è non privilegiata. Sul 68010 e successivi, è privilegiata. Il 68010 introdusseMOVE from CCRcosì che il software in modalità utente potesse leggere il byte dei condition-code senza leggere l'intero registro di stato.RTE— Il formato dello stack frame differisce tra 68000 e 68010+. Il 68010 aggiunse un throwaway frame e un bus-cycle restart frame per il supporto memoria virtuale; la format word sullo stack dice all'handler quale tipo è presente.TAS— Una forma in memoria usa il meccanismo read-modify-write del processore ed è intesa come primitiva di sincronizzazione atomica. Se sia sufficiente per un particolare sistema multiprocessore dipende anche dal design cache-coherency e bus della piattaforma; non affermare cheTASin cache sia intrinsecamente non-atomica sul 68040/68060.CAS,CAS2, eTAS— Motorola classifica queste come istruzioni read-modify-write multiprocessore che forniscono aggiornamenti di memoria ininterrotti. Le regole di coerenza platform-specific rimangono rilevanti, ma le operazioni ISA stesse sono primitive di sincronizzazione atomica.MOVE16— Trasferisce un blocco allineato a 16 byte ed è disponibile sul MC68040 e MC68060. L'architettura fornisce forme con postincremento registro e forme absolute-long; usa le restrizioni esatte di operando e regole di allineamento dal manuale del processore target. Non generalizzare il comportamento di misalignment o i requisiti di modalità cache da un'implementazione all'altra senza verificare la definizione specifica 68040/68060.PFLUSH/PTEST— su MC68060/MC68LC060 completi, la famigliaPFLUSHè nativa e opera sugli ATC on-die;PTESTnon è implementata.PLPAfornisce l'helper di traduzione logico→fisico specifico del 68060. MC68EC060 non ha MMU e deve essere trattato separatamente.- Differenze interfaccia MMU — Il 68030 usa
PMOVEper manipolare la sua MMU; il 68040 usaMOVECpiùPFLUSH/PTEST. Il codice che mira alla MMU del 68030 deve essere portato.
Vedi anche¶
- Modello di programmazione 68000 — set di registri, modalità di indirizzamento, condition code
- Evoluzione 68000, 68010, e 68020 — differenze di famiglia e miglioramenti architetturali
- MMU e Cache 68030 — gestione memoria sul 68030
- Architettura 68040/68060 — bus modalità burst, MMU, e FPU
- Riferimento registri — encoding opcode-a-registro completo
Fonti: Motorola, M68000 8-/16-/32-Bit Microprocessor User's Manual (MC68000UM), 1st printing 1992, Table 2-2 "Instruction Set Summary" (Sheets 1-4, pp. 2-11 → 2-14). Motorola, M68020 32-Bit Microprocessor User's Manual (MC68020UM), 1989, Table 1-2 "Instruction Set" (pp. 1-10 → 1-11); Chapter 1.4 "Instruction Set Overview"; Section 1.3 "Virtual Memory/Machine Concepts". Motorola, MC68030 User's Manual (MC68030UM), 1989/1990, Table 1-2 "Instruction Set" (pp. 1-12 → 1-13); Section 1.7 "The Memory Management Unit"; Section 1.9 "The Cache Memories". Motorola/Freescale, MC68040 User's Manual (MC68040UM), 1993, Table 1-4 "Instruction Set Summary" (pp. 1-14 → 1-21) e la lista istruzioni FPU a p. 1-16. Motorola/Freescale, M68060 User's Manual (MC68060UM), 1993, Table 1-3 "Instruction Set Summary" (pp. 1-16 → 1-21); Appendix C.2 "Unimplemented Integer Instructions" (p. C-4); Section 6.5.1 "Unimplemented Floating-Point Instructions" Table 6-11 (p. 6-19). Motorola, M68000 Family Reference Manual — sezione MC68881 Floating-Point Coprocessor (estratta dal FRM come inbox/mtgf88xv_MC68881UM.PDF, scansione 48 pagine, 1985); il file è image-only (nessun text layer), quindi l'ho OCR-izzato con tesseract 5.5.3 (binario nix-store) a 200 dpi via pdftoppm — estratto in raw/hardware/mc68881um.md per il capitolo 68881; cross-referenziato con il set di istruzioni MC68881 pubblicamente documentato e con MC68040UM Table 1-4 (che elenca il set di istruzioni 68882 completo). Motorola, MC68881/MC68882 Floating-Point Coprocessor User's Manual / materiale di riferimento floating-point M68000 Family; l'archivio locale contiene anche estratti OCR dei capitoli MC68881 e MC68882. I due coprocessori condividono lo stesso set di istruzioni visibile al programmatore; il MC68882 cambia principalmente le caratteristiche di implementazione/prestazioni. Differenze 68010 cross-referenziate contro MC68010UM (PDF image-only, contenuto verificato contro miglioramenti 68010 pubblicamente documentati).
Raw: raw/hardware/mc68000um.md (estratto testo via pdftotext da MC68000UM 188pp); raw/hardware/mc68020um.md (estratto testo via pdftotext da MC68020UM 452pp); raw/hardware/mc68030um.md (estratto testo via pdftotext da MC68030UM 599pp); raw/hardware/mc68040um.md (estratto testo via pdftotext da MC68040UM 442pp); raw/hardware/mc68060um.md (estratto testo via pdftotext da MC68060UM 416pp); raw/hardware/mc68881um.md (OCR via tesseract 5.5.3 da inbox/mtgf88xv_MC68881UM.PDF scansione 48 pp a 200 dpi); raw/hardware/mc68882um.md (OCR via tesseract 5.5.3 da inbox/mtgfi0ge_MC68882UM.PDF scansione 45 pp a 200 dpi).
Aggiornato: 2026-09-02