Question

Je ne suis pas en mesure de faire la différence entre vld4_f32 et vld4q_f32 dans les instructions ARM NEON.

La confusion a commencé quand je levais les niveaux de codage et commencé à regarder les instructions de montage plutôt que les valeurs intrinsèques moins instructives.

La raison pour laquelle je dois utiliser vld4 instruction de variante est ici parce que, je voudrais saisir 4 float32_t de de tous les 4 Position de mon large gamme.

text alt

Les valeurs intrinsèques de vld4_f32 et les instructions de montage correspondantes ressemblent à ceci ( De cette lien )

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

Les valeurs intrinsèques de vld4q_f32 et ses instructions de montage correspondant se présente comme suit

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

Eh bien, au niveau intrinsics la différence que je vois est le type de retour , mais si je regarde l'instruction de montage et le nombre de registres, ils ont tous deux ressemblent à la même chose. De quelle façon le compilateur ou l'assembleur connaître la différence entre les deux?

Quelqu'un peut-il clarifier plus sur ce sujet et aussi expliquer comment je peux obtenir le chargement 4 float32_t des valeurs qui sont positionnées à chaque 4ème emplacement mémoire dans un seul registre?

Était-ce utile?

La solution

Oui, j'ai découvert la différence. Je CodeSourcery pour voir le contenu du registre réel pour toutes les instructions de charge. Le lien que j'ai posté ne donne pas les détails complets sur le vld4q_f32.

Ok, vient d'abord le vld4_f32, cette charge 4 d registres (par exemple d16-19) chacun d registre est de 64 bits de long, de sorte que cette instruction va charger le premier 8 valeurs entrelacées avec un intervalle de quatre comme représenté sur la figure ci-dessous. text alt

Dans le second cas, le vld4q_f32, cette charge 8 d registres (par exemple d16-23) au lieu de quatre. Pour un lecteur de ce lien , il est pas du tout clair que 8 registres seront chargés. Quand je regardé le code de dé-assemblé pour une vld4qf32, il a été fait usage de 8 registres d.

Cette instruction va en effet faire ce que j'espérais à faire dire à charger 4 valeurs float32_t qui sont à l'intervalle de 4 comme le montre la figure ci-dessous. text alt

Autres conseils

J'ai démonté deux intrinsics, peut-être il aide à quelqu'un:

// 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]
scroll top