result = vml (matrix[0], vector);
result = vmla (result, matrix[1], vector);
result = vmla (result, matrix[2], vector);
result = vmla (result, matrix[3], vector);
Diese Sequenz funktioniert jedoch nicht.Das Problem ist, dass x-Komponente ansammelt nur durch die Matrix-Zeilen moduliert X und kann ausgedrückt werden als:
result.x = vector.x * (matrix[0][0] + matrix[1][0] + matrix[2][0] + matrix[3][0]);
...
Die richtige Reihenfolge wäre:
result = vml (matrix[0], vector.xxxx);
result = vmla(result, matrix[1], vector.yyyy);
...
NEON und SSE haben keine eingebaute Auswahl für die Felder (dies würde 8 Bits in Instruktionscodierung pro Vektorregister erfordern). GLSL/HLSL zum Beispiel hat diese Art von Einrichtungen, so dass die meisten GPUs auch haben.
Alternative Art und Weise, dies zu erreichen wäre:
result.x = dp4(vector, matrix[0]);
result.y = dp4(vector, matrix[1]);
... // und natürlich wäre die Matrix transponieren für dieses gleiche Ergebnis madd
Die mul, zu erhalten, madd, Die madd-Sequenz wird normalerweise bevorzugt, da sie keine Schreibmaske für die Zielregisterfelder benötigt.
Ansonsten sieht der Code gut aus. =)
Die GCC-Dokumente (und die RealView-Dokumente für die Grundlagen, auf denen die GCC-Grundlagen basieren) sind ziemlich spärlich ... Wenn Sie keine vernünftige Antwort bekommen, würde ich vorschlagen, nur eine zu kompilieren einige Aufrufe und einen Blick auf die Baugruppe, die ausgegeben wird. Das sollte Ihnen eine ziemlich gute Idee geben (auch wenn es ein weniger als idealer Weg ist). –