2016-04-10 10 views
0

Ich versuche, diesen Neon-Code intrinsics zu konvertieren:Wie laden Sie 3 Floats mit Neon-Spezifika

vld1.32    {d0}, [%[pInVertex1]] 
flds     s2, [%[pInVertex1], #8] 

Diese Lasten 3 32-Bit aus der Variablen pInVertex1 in den d0 und d1 Register schwimmt. Ich kann keine gleichwertige Version für Instrinsics finden. Es gibt vld1q_f32, aber das funktioniert nur für 4 Floats. Wer weiß von einem effizienten Weg, dies zu tun (ich meine, ohne extra Kopieren)?

+0

Ist es möglich, die Registerverwendungs ​​so zu optimieren, dass sie mit einer einspurigen 'vld3', dh' s0' arbeiten konnte, 's2',' s4' statt 's0',' s1', 's2'? (obwohl ich mir nicht sicher bin, wie das in intrinsics aussehen würde.) Ansonsten ist es vielleicht eine Überlegung wert, dass das Laden von 4 Elementen mit einem einzigen 'vld1' und das Ignorieren eines von ihnen nicht weniger effizient ist als zwei separate Anweisungen (und möglicherweise auch), vorausgesetzt, a) es ist in Ordnung, 's3' zu zerlegen und b) Sie legen die Daten so aus, dass es nie problematisch ist, über das Ende hinaus zu lesen. – Notlikethat

+0

Vielleicht könnte ich es tun, aber es würde nur zum Laden von Werten funktionieren. Wenn ich die 3 Werte in das Array schreibe, habe ich das gleiche Problem. Wenn ich 4 Werte schreibe, überschreibe ich Daten von einem anderen Knoten. – user3259383

Antwort

0

Die einzige Anweisung, die nur 32-Bit-3 Schwimmern in Aarch32 schreibt eine Befehl-Mehrfachbelastung:

r0 holds the address of the structure 
FLDMIAS r0, {s0-s2} 

Dies kann entweder in VFP oder Neon-Code verwendet werden.

Ich weiß nicht über die entsprechende intrinsische.

+0

Danke, das ist nützlich zu wissen. Also, es ist die intrinsische Version von FLDMIAS, die ich brauche. – user3259383

0

In DirectXMath implementiert ich die ARM-NEON-Version XMLoadFloat3 als:

float32x2_t x = vld1_f32(reinterpret_cast<const float*>(pSource)); 
float32x2_t zero = vdup_n_f32(0); 
float32x2_t y = vld1_lane_f32(reinterpret_cast<const float*>(pSource)+2, zero, 0); 
return vcombine_f32(x, y);