Estoy tratando de optimizar mi código utilizando los intrínsecos de Neon. Tengo una rotación de 24 bits en una matriz de 128 bits (8 cada uint16_t
).Rotación de 128 bits utilizando intrínsecos de ARM Neon
Aquí está mi código C:
uint16_t rotated[8];
uint16_t temp[8];
uint16_t j;
for(j = 0; j < 8; j++)
{
//Rotation <<< 24 over 128 bits (x << shift) | (x >> (16 - shift)
rotated[j] = ((temp[(j+1) % 8] << 8) & 0xffff) | ((temp[(j+2) % 8] >> 8) & 0x00ff);
}
He comprobado la documentación sobre gcc Neon Intrinsics y no tiene instrucciones para rotaciones de vector. Además, he intentado hacer esto usando vshlq_n_u16(temp, 8)
pero todos los bits cambiados fuera de una palabra uint16_t
se pierden.
¿Cómo lograr esto usando intrínsecos de neón? Por cierto, ¿hay una mejor documentación sobre GCC Neon Intrinsics?
'' armcc' ha __ror' intrínseca – ouah
¿Qué pasa con el uso de ensamblado en línea con la instrucción 'ROR' ARM? – ouah
Prefiero evitar el ensamblaje. Por cierto estoy usando GCC así que no armcc! – Kami