Estoy tratando de encontrar una manera de realizar una operación indirecta de desplazamiento a la izquierda/derecha sin utilizar realmente la variable shift op o cualquier rama.¿Emula el cambio de bit variable usando solo cambios constantes?
El procesador PowerPC particular, estoy trabajando en tiene la peculiaridad de que un cambio por constante inmediata, como
int ShiftByConstant(int x) { return x << 3 ; }
es rápido, sencillo-op, y superescalar, mientras que un cambio por caso variables, como
int ShiftByVar(int x, int y) { return x << y ; }
Lo que me gustaría hacer es averiguar qué números PPC enteros no microcodificados se decodifican en sraw y luego emitirlos individualmente. Esto no ayudará con la latencia del sraw en sí — reemplazará una operación con seis — pero entre esas seis operaciones puedo despachar dos tareas a las otras unidades de ejecución y obtener una ganancia neta.
Parece que no puedo encontrar μ ops sraw decodifica en — ¿Alguien sabe cómo puedo reemplazar un cambio de bit variable con una secuencia de cambios constantes y operaciones enteras básicas? (Un bucle o un interruptor o cualquier cosa con una bifurcación no funcionará porque la penalización de bifurcación es incluso mayor que la penalización de microcódigo.)
No es necesario responder esta pregunta en el conjunto; Espero aprender el algoritmo en lugar del código en particular, por lo que una respuesta en C o un lenguaje de alto nivel o incluso un pseudocódigo sería perfectamente útil.
edición: Un par de aclaraciones que debo añadir:
- ni siquiera estoy un poco preocupado acerca de la portabilidad
PPC tiene un condicional-movimiento, por lo que puede suponer la existencia de una función intrínseca sin sucursal
int isel (a, b, c) {return a> = 0? antes de Cristo; }
(si se escribe un ternaria que hace lo mismo voy a conseguir lo que quiere decir )
- número entero se multiplican también microcodificado e incluso más lento que sraw. :-(
Una cosa que me viene a la mente es Duffs Dispositivo (http://en.wikipedia.org/wiki/Duffs_device) con instrucciones de desplazamiento de un bit en lugar. Necesitas una rama y luego varias instrucciones de turno, así que supongo que es más lento. – some
@ Some: La penalización de una sola rama es mayor que la penalización de la instrucción de microcódigo, por lo que un Duffs Device no sería una optimización. – Adisak
playstation3/programador celular, ¿eh? –