result = vml (matrix[0], vector);
result = vmla (result, matrix[1], vector);
result = vmla (result, matrix[2], vector);
result = vmla (result, matrix[3], vector);
Sin embargo, esta secuencia no funcionará.El problema es que el componente x solamente se acumula x modulada por las filas de la matriz y se puede expresar como:
result.x = vector.x * (matrix[0][0] + matrix[1][0] + matrix[2][0] + matrix[3][0]);
...
La secuencia correcta sería:
result = vml (matrix[0], vector.xxxx);
result = vmla(result, matrix[1], vector.yyyy);
...
NEON y SSE no tienen una selección incorporada para los campos (esto requeriría 8 bits en la codificación de instrucciones, por registro vectorial). GLSL/HLSL, por ejemplo, tiene este tipo de instalaciones, por lo que la mayoría de las GPU también lo tienen.
forma alternativa para lograr esto sería:
result.x = dp4(vector, matrix[0]);
result.y = dp4(vector, matrix[1]);
... // y por supuesto, la matriz sería transponer para que esto dió mismo resultado
El mul, madd, madd, Por lo general, se prefiere la secuencia madd ya que no requiere una máscara de escritura para los campos de registro de destino.
De lo contrario, el código se ve bien. =)
Los documentos de GCC (y los documentos de RealView para los intrínsecos en los que parecen basarse los intrínsecos de GCC) son bastante escasos ... Si no obtiene una respuesta decente, sugiero que solo compile una algunas llamadas y echar un vistazo a la asamblea que sale. Eso debería darte una idea bastante buena (incluso si es una manera menos que ideal de ir). –