Sto cercando di ottimizzare il mio codice usando Neon intrinsics. Ho una rotazione a 24 bit su un array a 128 bit (8 ogni uint16_t
).Rotazione a 128 bit usando ARM Neon intrinsec
Ecco il mio codice 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);
}
Ho controllato la documentazione gcc su Neon Intrinsics e non ha istruzioni per rotazioni vettoriali. Inoltre, ho provato a farlo utilizzando vshlq_n_u16(temp, 8)
ma tutti i bit spostati all'esterno di una parola uint16_t
vengono persi.
Come ottenere ciò utilizzando gli intrinsechi al neon? A proposito, c'è una documentazione migliore su GCC Neon Intrinsics?
'' armcc' ha __ror' intrinseca – ouah
Cosa succede ad usare l'assembly inline con l'istruzione 'ROR' ARM? – ouah
Preferisco evitare il montaggio. Dal modo in cui sto usando GCC quindi nessun armcc! – Kami