#include "Vec128.h"
void Mat4x4MulF32_(float *m_des, const float* m_src1, const float *m_src2) {
__asm volatile("\n\
ld1 {v0.4s-v3.4s}, [x1] // m_src1 \n\
ld1 {v4.4s-v7.4s}, [x2] // m_src2 \n\
\n\
// Row 0 \n\
fmul v16.4s, v4.4s, v0.s[0] // v16 = v4 * v0.lane0 \n\
fmla v16.4s, v5.4s, v0.s[1] // v16 += v5 * v0.lane1 \n\
fmla v16.4s, v6.4s, v0.s[2] // v16 += v6 * v0.lane2 \n\
fmla v16.4s, v7.4s, v0.s[3] // v16 += v6 * v0.lane3 \n\
st1 {v16.4s}, [x0], 16 \n\
\n\
// Row 1 \n\
fmul v17.4s, v4.4s, v1.s[0] // v17 = v4 * v1.lane0 \n\
fmla v17.4s, v5.4s, v1.s[1] // v17 += v5 * v1.lane1 \n\
fmla v17.4s, v6.4s, v1.s[2] // v17 += v6 * v1.lane2 \n\
fmla v17.4s, v7.4s, v1.s[3] // v17 += v6 * v1.lane3 \n\
st1 {v17.4s}, [x0], 16 \n\
\n\
// Row 2 \n\
fmul v18.4s, v4.4s, v2.s[0] // v18 = v4 * v2.lane0 \n\
fmla v18.4s, v5.4s, v2.s[1] // v18 += v5 * v2.lane1 \n\
fmla v18.4s, v6.4s, v2.s[2] // v18 += v6 * v2.lane2 \n\
fmla v18.4s, v7.4s, v2.s[3] // v18 += v6 * v2.lane3 \n\
st1 {v18.4s}, [x0], 16 \n\
\n\
// Row 3 \n\
fmul v19.4s, v4.4s, v3.s[0] // v19 = v4 * v3.lane0 \n\
fmla v19.4s, v5.4s, v3.s[1] // v19 += v5 * v3.lane1 \n\
fmla v19.4s, v6.4s, v3.s[2] // v19 += v6 * v3.lane2 \n\
fmla v19.4s, v7.4s, v3.s[3] // v19 += v6 * v3.lane3 \n\
st1 {v19.4s}, [x0], 16 \n\
"
:
:
: "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", "v17", "v18", "v19", "x0"
);
}
|