Algunos juegos de instrucciones están limitados a un cambio de bit por instrucción.Y algunos conjuntos de instrucciones le permiten especificar cualquier cantidad de bits para cambiar en una instrucción, que generalmente toma un ciclo de reloj en procesadores modernos (el ser moderno es una palabra intencionalmente vaga). Consulte dan04's answer sobre una palanca de cambio de barril, un circuito que cambia más de un bit en una operación.
Todo se reduce al algoritmo lógico. Cada bit en el resultado es una función lógica basada en la entrada. Para un solo desplazamiento a la derecha, el algoritmo sería algo así como:
- Si la instrucción es [desplazamiento a la derecha] y el bit 1 de la entrada es 1, entonces el bit 0 del resultado es 1, el bit demás 0 es 0 .
- Si la instrucción es [desplazamiento a la derecha], entonces el bit 1 = poco 2.
- etc.
Pero la ecuación lógica podría ser tan fácil:
- Si la instrucción es [shift right] y la cantidad operand es 1, entonces resultado bit 0 = bit de entrada desplazado 1.
- si la cantidad es 2 entonces bit 0 = bit 2.
- y así sucesivamente.
Las puertas lógicas, al ser asíncronas, pueden hacer todo esto en un ciclo de reloj. Sin embargo, es cierto que el cambio único permite un ciclo de reloj más rápido y menos puertas para establecerse, si todo lo que está comparando son estos dos sabores de una instrucción. O la alternativa es hacer que tome más tiempo para establecerse, por lo que la instrucción toma 2 o 3 relojes o lo que sea, y la lógica cuenta a 3 y luego bloquea el resultado.
El MSP430, por ejemplo, solo tiene instrucciones rotatorias de un solo bit a la derecha (porque puede realizar un solo desplazamiento de bit o girar a la izquierda con otra instrucción, que dejaré al lector para que lo descubra).
El conjunto de instrucciones ARM permite giros de varios bits inmediatos y de registro, cambios aritméticos y cambios lógicos. Creo que solo hay una instrucción de rotación real y la otra es un alias, porque girar a la izquierda 1 es lo mismo que girar a la derecha 32, solo necesitas una palanca de cambios de una dirección para implementar una rotación de múltiples bits.
SHL en el x86 permite más de un bit por instrucción, pero solía llevar más de un reloj.
y así sucesivamente, puede examinar fácilmente cualquiera de los conjuntos de instrucciones que existen.
La respuesta a tu pregunta es que no se solucionó. Algunas veces es una operación, un ciclo, una instrucción. A veces es una instrucción de ciclos de reloj múltiples. A veces se trata de instrucciones múltiples, ciclos de reloj múltiples.
Los compiladores a menudo optimizan para este tipo de cosas. Supongamos que tiene un conjunto de instrucciones de registro de 16 bits con una instrucción de byte de intercambio y una instrucción AND con cambio inmediato, pero con solo un bit. Puede pensar que desplazar 8 bits requeriría 8 ciclos de instrucciones de desplazamiento, pero podría simplemente intercambiar bytes (una instrucción) y luego Y y la mitad inferior a ceros (lo que podría tomar dos instrucciones, o podría ser una instrucción de longitud de palabra variable de dos palabras, o puede codificar en una sola instrucción) por lo que solo se necesitan 2 o 3 ciclos de instrucción/reloj en lugar de 8. Para un cambio de 9 bits, puede hacer lo mismo y agregar un cambio, lo que lo convierte en 9 relojes frente a 3 o 4 Además, en algunas arquitecturas, es más rápido multiplicar por 256 que cambiar por 8, etc., etc. Cada conjunto de instrucciones tiene sus propias limitaciones y trucos.
Ni siquiera es el caso de que la mayoría de los conjuntos de instrucciones proporcionen múltiples bits o la mayoría de los límites a un solo bit. Los procesadores que entran en la categoría "computadora", como X86, ARM, PowerPC y MIPS, se inclinarían hacia una operación para cambiar. Expande a todos los procesadores, pero no necesariamente a las "computadoras" comúnmente utilizadas en la actualidad, y cambia para otro lado, yo diría que más de ellas son de un solo bit que de múltiples bits, por lo que se necesitan múltiples operaciones para realizar un cambio de múltiples bits.
¿Requieren más operaciones para desplazarse a la izquierda 31? – Flexo
Mi conocimiento de CPU es bastante antiguo, pero cada instrucción de cambio que he visto cambia un poco, por lo que necesita ejecutar un ciclo para cambiar más de una vez. Supongo que es posible que las CPU modernas tengan instrucciones de desplazamiento que cambien en un número específico de bits en un ciclo de reloj. –
En mi máquina 'int test (int i) { return i << 30; } 'se convierte en' saltos $ 30,% eax' – Flexo