Frage

Ich bin nicht in der Lage, den Unterschied zwischen vld4_f32 und vld4q_f32 in ARM NEON Anweisungen zu erkennen.

Die Verwirrung begann, als ich meine Codierebenen angehoben und begann in der Montageanleitung suchen, anstatt die weniger informativ intrinsics.

Der Grund, warum ich verwenden müssen vld4 Variante Unterricht hier ist, weil, ich capture möchte 4 float32_t die von jedem 4. Position meiner große Auswahl.

alt text

Die vld4_f32 Spezifika und die entsprechenden Montageanleitung wie folgt aussehen ( Von diesem Link )

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

Die vld4q_f32 intrinsics und seine entsprechende Montageanleitung wie folgt aussieht

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

Nun, auf der intrinsics Ebene der Unterschied ich sehe, ist der Rückgabetyp , aber wenn ich mir die Montageanleitung und die Anzahl der Register, sie beide aussehen wie das gleiche. Wie wird der Compiler oder Assembler kennen den Unterschied zwischen den beiden?

klärt jemand mehr zu diesem und auch erklären, wie ich Belastung erreichen kann 4 float32_t Werte, die so positioniert sind bei jedem 4. Speicherplatz in ein einzelnes Register?

War es hilfreich?

Lösung

Ja, ich fand den Unterschied aus. Ich benutzte CodeSourcery die aktuellen Registerinhalte für alle Ladeanweisungen zu sehen. Der Link, den ich gepostet habe nicht gibt die vollständigen Details über die vld4q_f32.

Okay, kommen zuerst die vld4_f32, diese Lasten 4 d Register (zB d16-19) jeweils d Register sind 64 Bits lang, so dass in dieser Anweisung die ersten Last wird 8 Werte mit einem Intervall von 4 verschachtelt, wie in der folgenden Abbildung dargestellt. alt text

Im zweiten Fall wird die vld4q_f32, diese Lasten 8 d Register (z.B. d16-23) anstelle von vier. Für einen Leser dieser Link , ist es nicht klar, daß 8-Register geladen. Als ich im dis konfektionierter Code für ein vld4qf32 sah, wurde die Verwendung von 8 d Registern zu machen.

Diese Anweisung wird in der Tat tun, was ich habe gehofft, es heißt zu tun 4 float32_t Werte zu laden, die im Abstand von 4 wie in der Abbildung unten gezeigt. alt text

Andere Tipps

ich zwei intrinsics zerlegt haben, vielleicht hilft es jemand:

// 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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top