2011-08-26 8 views
11

Ho qualche problema a capire l'equivalenza NEON di un paio di operazioni Intel SSE. Sembra che NEON non sia in grado di gestire un intero registro Q contemporaneamente (tipo di dati a 128 bit). Non ho trovato nulla nell'intestazione arm_neon.h o nello NEON intrinsics reference.NEON vs Intel SSE - equivalenza di alcune operazioni

Quello che voglio fare è la seguente:

// Intel SSE 
// shift the entire 128 bit value with 2 bytes to the right; this is done 
// without sign extension by shifting in zeros 
__m128i val = _mm_srli_si128(vector_of_8_s16, 2); 
// insert the least significant 16 bits of "some_16_bit_val" 
// the whole thing in this case, into the selected 16 bit 
// integer of vector "val"(the 16 bit element with index 7 in this case) 
val = _mm_insert_epi16(val, some_16_bit_val, 7); 

Ho guardato le operazioni di spostamento forniti da NEON, ma non riuscivo a trovare un modo equivalente di fare quanto sopra (non ho molta esperienza con NEON). È possibile fare quanto sopra (suppongo sia solo che non so come)? Ogni suggerimento è stato molto apprezzato.

risposta

6

Si desidera l'istruzione VEXT. Il tuo esempio potrebbe essere simile:

int16x8_t val = vextq_s16(vector_of_8_s16, another_vector_s16, 1); 

Dopo questo, i bit di 0-111 val conterrà bit 16-127 di vector_of_8_s16, e bit 112-127 di val conterrà i bit 0-15 di another_vector_s16.

+0

L'ho già implementato in quel modo. Sarebbe possibile per te fornire un esempio in modo da convalidare il mio approccio? – celavek

+0

cancellata la mia risposta su vtbl e vtbx. vext è la strada da percorrere! –

+0

@celavek: ho fornito un esempio, ma il modo di convalidare il tuo approccio è provarlo, non confrontandolo con un esempio. Funziona o no. –