Domanda

Non sono in grado di distinguere la differenza tra vld4_f32 e vld4q_f32 nelle istruzioni ARM NEON.

La confusione è iniziato quando ho alzato il mio livello di codifica e iniziato a guardare le istruzioni di montaggio piuttosto che i intrinseci meno informativo.

La ragione per cui ho bisogno di usare vld4 di istruzioni variante qui è perché, vorrei cattura 4 float32_t di da ogni 4 ° posizione della mia grande array.

alt text

I intrinseci vld4_f32 e le istruzioni di montaggio corrispondenti appaiono così ( Da questo link )

float32x2x4_t vld4_f32 (const float32_t *) 
Form of expected instruction(s): vld4.32 {d0, d1, d2, d3}, [r0]

I intrinseci vld4q_f32 ed i suoi corrispondenti di montaggio Avviso di sguardi come questo

float32x4x4_t vld4q_f32 (const float32_t *) 
Form of expected instruction(s): vld4.32 {d0, d1, d2, d3}, [r0]

Bene, a livello intrinseche la differenza che vedo è il tipo di ritorno , ma se guardo le istruzioni di montaggio e il numero di registri, entrambi aspetto come lo stesso. In che modo il compilatore o assemblatore conoscere la differenza tra i due?

Qualcuno può chiarire di più su questo e anche spiegare come posso raggiungere carico 4 float32_t i valori che sono posizionati in ogni locazione di memoria 4 in un unico registro?

È stato utile?

Soluzione

Sì, ho scoperto la differenza. Ho usato CodeSourcery di vedere il contenuto effettivo dei registri per tutte le istruzioni di carico. Il link che ho postato non fornisce i dettagli completi sul vld4q_f32.

Ok, prima viene la vld4_f32, questo carichi 4 d registri (es d16-19) ogni d registro è di 64 bit di lunghezza, quindi questa istruzione caricherà la prima 8 valori intercalati con un intervallo di 4 come mostrato in figura. alt text

Nel secondo caso la vld4q_f32, questo carichi 8 d registri (ad esempio d16-23) invece di quattro. Per un lettore di questo link , non è affatto chiaro che verranno caricati 8 registri. Quando ho guardato il codice smontata per un vld4qf32, stava facendo uso di 8 D registri.

Questa istruzione sarà davvero fare quello che speravo che faccia cioè caricare 4 valori float32_t che sono ad intervalli di 4 come mostrato in figura. alt text

Altri suggerimenti

Ho smontato due intrinseci, forse aiuta a qualcuno:

// C++
uint32x4x4_t r = vld4q_u32( ( uint32_t *) output );
// assembly
VLD4.32         {D16,D18,D20,D22}, [R0]!
VLD4.32         {D17,D19,D21,D23}, [R0]

// C++
uint32x2x4_t r = vld4_u32( ( uint32_t *) output );
// assembly
VLD4.32         {D20-D23}, [R0]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top