¿Cómo girar a la derecha un valor de 64 bits de manera eficiente en el ensamblador de ARM7?

StackOverflow https://stackoverflow.com/questions/5379218

Pregunta

El conjunto ARM7-Command ofrece formas eficientes de rotar los valores de 32 bits por una cantidad arbitraria en el ensamblador. Para el segundo operando de una operación, incluso es "gratis" especificando ror #n Como operando de palanca de cambios, pero para enteros de 64 bits no se proporciona soporte directo por el conjunto de instrucciones. Además de los casos especiales de rotación en posiciones 1, 31, 33 o 63 bits (sin mencionar 0 o 32), solo sé cómo rotar un valor de 64 bits usando cuatro Instrucciones (es bastante fácil, así que no lo escribo aquí). En los cuatro casos especiales puedo reducir esto a tres instrucciones, pero no sé cómo hacerlo en general. Ésta es mi pregunta:

Dado un valor de 64 bits en dos registros, digamos R0 y R1, ¿es posible girar correctamente este valor por norte posiciones (para arbitrarias norte) con tan solo Tres Instrucciones de ARM7?

¿Fue útil?

Solución

Si un registro (por ejemplo, R4) contiene la constante mágica adecuada (1 desplazada a la izquierda por la cantidad de rotación izquierda deseada) Creo que uno puede hacerlo en dos instrucciones:

  umull r3,r2,r1,r4
  umlal r2,r3,r0,r4

Más lento que usar cuatro instrucciones de un solo ciclo, pero incluso si uno tiene que cargar R4 con la constante adecuada, es aún más compacta que los métodos de cuatro instrucciones.

Otros consejos

Si hay una solución a esto, GCC tampoco lo reconoce:

unsigned long long int reg64 = random_value;
unsigned int n = shift_value;
reg64 = (reg64 >> (n%64)) | (reg64 << ((64-n)%64));

Resulta en lo siguiente:

n = 1:

MOVS R2, R0, LSR #1
MOV R3, R1, RRX
ORR R2, R2, R1, ASL #31

n = 2-31:

MOV R2, R0, LSR #n
ORR R2, R2, R1, ASL #32-n
MOV R3, R0, ASL #32-n
ORR R3, R3, R1, LSR #n

n = 33-62:

MOV R3, R0, ASL #64-n
ORR R3, R3, R1, LSR #n-32
MOV R2, R0, LSR, #n-32
ORR R2, R2, R1, ASL #64-n

n = 63:

ADDS R2, R0, R0
ADC R3, R1, R1
ORR R2, R2, R1, LSR #31
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top