Alcuni set di istruzioni sono limitati a uno spostamento di bit per istruzione.E alcuni set di istruzioni consentono di specificare un numero qualsiasi di bit da spostare in un'unica istruzione, che di solito richiede un ciclo di clock sui processori moderni (il moderno è una parola volutamente vaga). Vedere dan04's answer su un barrel shifter, un circuito che sposta più di un bit in un'unica operazione.
Tutto si riduce all'algoritmo logico. Ogni bit nel risultato è una funzione logica basata sull'input. Per un singolo spostamento a destra, l'algoritmo sarebbe qualcosa di simile:
- Se l'istruzione è [spostamento a destra] e bit 1 dell'ingresso è di 1, quindi bit 0 del risultato è 1, altrimenti il bit 0 è 0 .
- Se l'istruzione è [spostamento a destra], allora il bit 1 = bit 2.
- ecc
Ma l'equazione logica potrebbe facilmente essere:
- Se l'istruzione è [shift right] e l'importo operando è 1, risultato bit 0 = bit di ingresso spostato 1.
- se la quantità è 2 quindi bit 0 = bit 2.
- e così via.
Le porte logiche, essendo asincrone, possono fare tutto questo in un ciclo di clock. Eppure è vero che il singolo turno consente un ciclo di clock più veloce e meno porte da regolare, se tutto ciò che si sta confrontando sono questi due sapori di un'istruzione. Oppure l'alternativa sta richiedendo più tempo per stabilirsi, quindi l'istruzione prende 2 o 3 orologi o qualsiasi altra cosa, e la logica conta fino a 3, quindi blocca il risultato.
L'MSP430, ad esempio, ha solo istruzioni di rotazione di bit a destra (poiché è possibile eseguire un solo spostamento di bit o una rotazione a sinistra con un'altra istruzione, che lascerò al lettore per capire).
Il set di istruzioni ARM consente sia rotazioni multi-bit immediate e basate su registri, spostamenti aritmetici e spostamenti logici. Penso che ci sia solo un'effettiva istruzione di rotazione e l'altra è un alias, perché ruotare a sinistra 1 è la stessa di una rotazione a destra 32, è necessario solo un barilotto a una direzione per implementare una rotazione a più bit.
SHL in x86 consente più di un bit per istruzione, ma ha utilizzato più di un orologio.
e così via, è possibile esaminare facilmente qualsiasi set di istruzioni.
La risposta alla tua domanda è che non è stato risolto. A volte è una operazione, un ciclo, una istruzione. A volte è un ciclo di clock multipli di una istruzione. A volte si tratta di più istruzioni, più cicli di clock.
I compilatori spesso ottimizzano per questo tipo di cose. Supponiamo che tu abbia un'istruzione di registro a 16 bit impostata con un'istruzione swap byte e un'istruzione AND con immediato, ma solo un singolo bit shift. Potresti pensare che lo spostamento di 8 bit richiederebbe 8 cicli di istruzione di spostamento, ma potresti semplicemente scambiare byte (una istruzione) e poi AND la metà inferiore a zero (che potrebbe richiedere due istruzioni, o potrebbe essere un'istruzione di lunghezza di parola variabile di due parole, o potrebbe codificarsi in una singola istruzione) quindi richiede solo 2 o 3 cicli di istruzione/clock invece di 8. Per uno spostamento di 9 bit, puoi fare la stessa cosa e aggiungere uno spostamento, rendendolo 9 orologi contro 3 o 4 Inoltre, su alcune architetture, è più veloce moltiplicare per 256 che per passare da 8, ecc. Ecc. Ogni set di istruzioni ha le proprie limitazioni e trucchi.
Non è nemmeno il caso che la maggior parte dei set di istruzioni fornisca il multi bit o la maggior parte del limite per il bit singolo. I processori che rientrano nella categoria "computer", come X86, ARM, PowerPC e MIPS, si sposteranno verso un'operazione da spostare. Espandere a tutti i processori ma non necessariamente "computer" comunemente usati oggi, e si sposta nell'altro senso, direi che molti di loro sono single bit di multi bit, quindi sono necessarie più operazioni per eseguire uno spostamento multi-bit.
Richiedono più operazioni per spostare a sinistra 31? – Flexo
La mia conoscenza della CPU è piuttosto vecchia, ma ogni istruzione di turno che ho visto cambia di un bit, quindi è necessario eseguire un ciclo per spostarsi più di una volta. Suppongo sia possibile che le moderne CPU abbiano istruzioni di spostamento che si spostano di un numero specificato di bit in un ciclo di clock. –
Sulla mia macchina 'int test (int i) { return i << 30; } 'diventa' sall $ 30,% eax' – Flexo