Tengo curiosidad acerca de por qué hay algunas instrucciones de ARM (como MUL y QADD) no utiliza la palanca de cambios de barril. Me gustaría saber la razón detrás del límite. ¡Gracias!¿Por qué algunas instrucciones ARM no usan barril de cambio?
Respuesta
No es que el cambio de barril no es usado; es que no puede especificar cómo se usa en todas las instrucciones excepto en las muy específicas (procesamiento de datos y carga/almacenamiento). Si miras la codificación de la instrucción, verás que simplemente no hay espacio para especificarla. En el caso de instrucciones como MUL
o SWP
, no estaban en la primera versión de la arquitectura. Fueron incluidos en el conjunto de instrucciones haciendo uso de combinaciones de valores que de otro modo serían inválidas para la especificación de la palanca de cambio de barril. Dado que los bits de especificación de la palanca de cambio de barril tuvieron que reutilizarse para almacenar cosas como qué instrucción ejecutar y qué registro usar como multiplicador, simplemente no había forma de especificar cuánto mover/rotar el operando.
Una palanca de cambio de barril se utiliza para cambios rápidos.
Como sabes si multiplicas un número con otro número que es una potencia de dos, solo tienes que cambiarlo a la izquierda. En este tipo de situaciones especiales puede usar un registro de desplazamiento. Pero en general las multiplicaciones son eficientes para seguir los diseños de multiplicadores normales.
- 1. ¿Qué es el conjunto de instrucciones ARM Thumb?
- 2. ¿Qué instrucciones de CPU usan la mayor potencia?
- 3. ¿Por qué algunas clases .NET Framework no usan genéricos cuando podrían?
- 4. ¿Los diferentes fabricantes de ARM ofrecen diferentes conjuntos de instrucciones?
- 5. Conversión de instrucciones ARM muy simples a binario/hex
- 6. ¿Por qué algunas personas usan el método de clase # en lugar de Class.method en la correspondencia?
- 7. ¿Por qué algunas personas usan "Ninguno" como miembro de la enumeración?
- 8. ¿Por qué no hay ARM en Scala stdlib?
- 9. ¿Protege mprotect la memoria caché de instrucciones en ARM Linux?
- 10. modos ARM y ¿por qué hay tantos?
- 11. ¿Por qué algunas personas usan 'if has ("gui_running")' en un .gvimrc?
- 12. Comprender el propósito de algunas instrucciones de ensamblaje
- 13. ¿Por qué no se usan los paquetes de erlang?
- 14. ¿Por qué los polyfills de console.log() no usan Function.apply()?
- 15. ¿Por qué WebView de Android no carga algunas URL?
- 16. ¿Por qué se generan AND instrucciones?
- 17. ¿Por qué java applets/javafx no se usan ampliamente? (por qué no debería usarlos para RIA)
- 18. ¿Por qué los controles WinForms/WPF no usan Invoke internamente?
- 19. ¿Por qué algunos sitios web importantes usan HTML no válido?
- 20. ¿Por qué los índices DB usan árboles balanceados, no hashtables?
- 21. ¿Por qué faltan algunas tareas de rastrillo?
- 22. ¿Por qué Javascript algunas veces no se carga en IE8?
- 23. ¿Por qué se pueden publicar algunas matrices pero no otras?
- 24. ¿Qué arquitecturas ARM admite LLVM?
- 25. ¿Por qué se usan clases estáticas?
- 26. pixel.gif, ¿por qué las personas lo usan?
- 27. ¿Por qué se usan campos ocultos?
- 28. Algunas fechas se reconocen como fechas, algunas fechas no se reconocen. ¿Por qué?
- 29. ¿Por qué los navegadores usan tanta memoria?
- 30. Referencia para x86 instrucciones por funcionalidad
Cambia un barril. No agrega ni se multiplica. –
Creo que la pregunta se parece más a "¿Por qué no puedo usar un valor desplazado en barril como último argumento para MUL o QADD?" La razón podría ser silicio (no suficientes transistores para implementar), podría ser codificación (no hay espacio en la instrucción para codificar turnos), podría ser que ralentizaría demasiado la instrucción, podría ser solo la regla de menos 100 puntos . Solo los diseñadores de ARM saben con certeza. Preguntar aquí es poco probable que aparezca una respuesta. –
Ya publico la pregunta en su foro. :) – chenwj