Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
inline void Matrix4ByVec4(float32x4x4_t* __restrict__ mat, const float32x4_t* __restrict__ vec, float32x4_t* __restrict__ result)
{
asm
(
"vldmia %0, { d24-d31 } \n\t"
"vld1.32 {q1}, [%1]\n\t"
for (int j = 0; j < 4; ++j) {
Matrix4ByVec4(&mvp, &squareVertices[j], &data[i + j].pos);
}
__attribute__((always_inline)) void CalculateSpriteVertsWorldPos(const float32x4x4_t* __restrict__ mvp, float32x4_t* __restrict__ v1, float32x4_t* __restrict__ v2, float32x4_t* __restrict__ v3, float32x4_t* __restrict__ v4)
{
__asm__ volatile
(
"vldmia %0, { q8-q11 }\n\t"
"vldmia %1, { q0-q3 } \n\t"
"vmul.f32 q12, q8, d0[0]\n\t"
"vmla.f32 q12, q9, d0[1]\n\t"
"vmla.f32 q12, q10, d1[0]\n\t"
"vmla.f32 q12, q11, d1[1]\n\t"
"vmul.f32 q13, q8, d2[0]\n\t"
"vmla.f32 q13, q9, d2[1]\n\t"
"vmla.f32 q13, q10, d3[0]\n\t"
"vmla.f32 q13, q11, d3[1]\n\t"
"vmul.f32 q14, q8, d4[0]\n\t"
"vmla.f32 q14, q9, d4[1]\n\t"
"vmla.f32 q14, q10, d5[0]\n\t"
"vmla.f32 q14, q11, d5[1]\n\t"
"vmul.f32 q15, q8, d6[0]\n\t"
"vmla.f32 q15, q9, d6[1]\n\t"
"vmla.f32 q15, q10, d7[0]\n\t"
"vmla.f32 q15, q11, d7[1]\n\t"
"vstmia %2, { q12 }\n\t"
"vstmia %3, { q13 }\n\t"
"vstmia %4, { q14 }\n\t"
"vstmia %5, { q15 }"
:
: "r" (mvp), "r" (squareVertices), "r" (v1), "r" (v2), "r" (v3), "r" (v4)
: "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
);
}
float32x4x4_t mvp;
Matrix4ByMatrix4((float32x4x4_t*)proj.m, (float32x4x4_t*)modelviewMat.m, &mvp);
for (int j = 0; j < 4; ++j) {
Matrix4ByVec4(&mvp, &squareVertices[j], &data[i + j].pos);
}
__restrict__ mvp, float32x4_t* __restrict__ v1, float32x4_t* __restrict__ v2, float32x4_t* __restrict__ v3, float32x4_t* __restrict__ v4)
{
__asm__ volatile
(
"vldmia %0, { q8-q11 }\n\t"
"vldmia %1, { q0-q3 } \n\t"
"vmul.f32 q12, q8, d0[0]\n\t"
"vmla.f32 q12, q9, d0[1]\n\t"
"vmla.f32 q12, q10, d1[0]\n\t"
"vmla.f32 q12, q11, d1[1]\n\t"
"vmul.f32 q13, q8, d2[0]\n\t"
"vmla.f32 q13, q9, d2[1]\n\t"
"vmla.f32 q13, q10, d3[0]\n\t"
"vmla.f32 q13, q11, d3[1]\n\t"
"vmul.f32 q14, q8, d4[0]\n\t"
"vmla.f32 q14, q9, d4[1]\n\t"
"vmla.f32 q14, q10, d5[0]\n\t"
"vmla.f32 q14, q11, d5[1]\n\t"
"vmul.f32 q15, q8, d6[0]\n\t"
"vmla.f32 q15, q9, d6[1]\n\t"
"vmla.f32 q15, q10, d7[0]\n\t"
"vmla.f32 q15, q11, d7[1]\n\t"
"vstmia %2, { q12 }\n\t"
"vstmia %3, { q13 }\n\t"
"vstmia %4, { q14 }\n\t"
"vstmia %5, { q15 }"
:
: "r" (mvp), "r" (squareVertices), "r" (v1), "r" (v2), "r" (v3), "r" (v4)
: "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
);
}
Оптимизация игр под iOS платформу. Векторизация кода