ARM NEON: Was ist der Unterschied zwischen vld4_f32 und vld4q_f32?
-
26-09-2019 - |
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.
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?
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.
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.
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]