Así que finalmente me convencí de probar y aprender/usar PowerPC (PPC). Todo va bien y la mayor parte de la información se encontró en línea. Sin embargo, al mirar algunos ejemplos me encontré con esto:
rlwinm r3, r3, 0,1,1¿Cómo haría esto en C? Intenté investigar un poco, pero no pude encontrar nada que me ayudara. ¡Gracias por adelantado!
rlwinm significa "Rotar palabra a la izquierda inmediatamente, luego y con máscara", y su uso correcto es
rlwinm RA, RS, SH, MB, MESegún la página de descripción :
- RA Especifica el registro de propósito general de destino donde se almacena el resultado de la operación.
- RS Especifica el registro fuente de propósito general para la operación.
- SH Especifica el valor de cambio para la operación.
- MB Especifica el valor inicial de la máscara para la operación.
- ME Especifica el valor final de la máscara para la operación.
- BM Especifica el valor de la máscara de 32 bits.
Y
- Si el valor de MB es menor que el valor de ME + 1, entonces los bits de máscara entre el punto de inicio y el punto final inclusive se establecen en unos. Todos los demás bits se establecen en ceros.
- Si el valor de MB es el mismo que el valor de ME + 1, los 32 bits de máscara se establecen en unos.
- Si el valor de MB es mayor que el valor de ME + 1, entonces todos los bits de máscara entre el valor de ME +1 y el valor de MB -1 inclusive se establecen en ceros. Todos los demás bits se establecen en unos.
Entonces, en su ejemplo, la fuente y el destino son los mismos. La cantidad de cambio es 0 , por lo que no hay cambio. Y MB=ME=1 , por lo que se aplica el primer caso, de modo que la máscara se convierte en ceros con el número de bit 1 como 1 , mientras se numera desde MSB=0 : 0x40000000 .
En C podemos escribirlo tan simple como
a &= 0x40000000; suponiendo que a es una variable de 32 bits.
rlwinm gira el valor de un registro dejado por el número especificado, realiza un AND y almacena el resultado en un registro.
Ejemplo: rlwinm r3, r4, 5, 0, 31
r4 es el registro de origen que se rota por 5 y antes de que el resultado rotado se coloque en r3 , también se le aplica AND con una máscara de bits de solo 1 s, ya que el intervalo entre 0 y 31 es el valor completo de 32 bits.
Ejemplo tomado de aquí .
Para una implementación de C , es posible que desee ver cómo girar a la izquierda y cómo AND , que debería ser trivial para construir juntos ahora. Algo como lo siguiente debería funcionar:
int rotateLeft(int input, int shift) { return (input << shift) | ((input >> (32 - shift)) & ~(-1 << shift)); } int rlwinm(int input, int shift, int mask) { return rotateLeft(input, shift) & mask; }