我需要使用内联asm编写一个常见任务:我使用的代码是Follows。
Vector3 Matrix3x3::objectToInertial(const Vector3 &v)
{
return Vector3(
m11 * v.x + m12 * v.y + m13 * v.z,
m21 * v.x + m22 * v.y + m23 * v.z,
m31 * v.x + m32 * v.y + m33 * v.z
);
}
如何使用asm: m11 * v.x + m12 * v.y
制作此等式?
答案 0 :(得分:2)
如果您真的想通过内联汇编程序计算m11 * v.x + m12 * v.y,请尝试此操作(我假设您要将结果存储在变量结果中):
__asm
{
fld m11
fmul v.x
fld m12
fmul v.y
faddp st(1), st
fstp result
}
如果您想了解有关汇编中浮点运算的更多信息,可以查看Art of Assembly Language - Chapter 14 - 您也可以将该书下载为pdf。
答案 1 :(得分:1)
#if *MICROSOFT_COMPILER_DETECTION*
#define APP_FORCEINLINE __forceinline
#else
#if *GCC_COMPILER_DETECTION*
#define APP_FORCEINLINE inline
#else
#define APP_FORCEINLINE /* */
#endif
#endif
APP_FORCEINLINE
Vector3 Matrix3x3::objectToInertial(const Vector3 &v) {
return Vector3(
m11 * v.x + m12 * v.y + m13 * v.z,
m21 * v.x + m22 * v.y + m23 * v.z,
m31 * v.x + m32 * v.y + m33 * v.z
);
请记住,内联只是编译器的建议,尽管它是强大的。
今天的优化编译器可能会受益于使用与此处使用的Matrix3x3类不同的数据结构。 XNAMATH.X(来自Microsoft XNA)旨在实现跨平台,并在可用于所请求的CPU时利用内置的数学运算内在函数。