result = vml (matrix[0], vector);
result = vmla (result, matrix[1], vector);
result = vmla (result, matrix[2], vector);
result = vmla (result, matrix[3], vector);
Questa sequenza non funziona, però.Il problema è che componente x accumula solo X modulata dalle righe di matrice e può essere espressa come:
result.x = vector.x * (matrix[0][0] + matrix[1][0] + matrix[2][0] + matrix[3][0]);
...
la sequenza corretta sarebbe:
result = vml (matrix[0], vector.xxxx);
result = vmla(result, matrix[1], vector.yyyy);
...
NEON e SSE non dispongono di selezione integrata per i campi (ciò richiederebbe 8 bit nell'istruzione che incodifica, per registro vettoriale). Ad esempio, GLSL/HLSL dispone di questo tipo di servizi, così come la maggior parte delle GPU.
modo alternativo per raggiungere questo sarebbe:
result.x = dp4(vector, matrix[0]);
result.y = dp4(vector, matrix[1]);
... // e naturalmente, la matrice sarebbe trasporre per questo cedere stesso risultato
Il mul, madd, madd, la sequenza di madd è solitamente preferita in quanto non richiede la maschera di scrittura per i campi del registro di destinazione.
In caso contrario, il codice sembra buono. =)
I documenti GCC (e la documentazione RealView per gli elementi intrinseci su cui gli elementi intrinseci del GCC sembrano essere basati su) sono piuttosto scarsi ... se non si ottiene una risposta decente, suggerirei di compilarne una poche chiamate e dare un'occhiata all'assemblea che è uscita. Questo dovrebbe darti una buona idea (anche se è un modo meno che ideale per andare). –