我已经编写了一些 x86 asm - fpu 例程来规范化三个浮点数的向量 - 这里是
_asm_normalize10:; Function begin
push ebp ; 002E _ 55
mov ebp, esp ; 002F _ 89. E5
mov eax, dword [ebp+8H] ; 0031 _ 8B. 45, 08
fld dword [eax] ; 0034 _ D9. 00
fmul st0, st(0) ; 0036 _ DC. C8
fld dword [eax+4H] ; 0038 _ D9. 40, 04
fmul st0, st(0) ; 003B _ DC. C8
fld dword [eax+8H] ; 003D _ D9. 40, 08
fmul st0, st(0) ; 0040 _ DC. C8
faddp st1, st(0) ; 0042 _ DE. C1
faddp st1, st(0) ; 0044 _ DE. C1
fsqrt ; 0046 _ D9. FA
fld1 ; 0048 _ D9. E8
fdivrp st1, st(0) ; 004A _ DE. F1
fld dword [eax] ; 004C _ D9. 00
fmul st(0), st1 ; 004E _ D8. C9
fstp dword [eax] ; 0050 _ D9. 18
fld dword [eax+4H] ; 0052 _ D9. 40, 04
fmul st(0), st1 ; 0055 _ D8. C9
fstp dword [eax+4H] ; 0057 _ D9. 58, 04
fld dword [eax+8H] ; 005A _ D9. 40, 08
fmulp st1, st(0) ; 005D _ DE. C9
fstp dword [eax+8H] ; 005F _ D9. 58, 08
pop ebp ; 0062 _ 5D
ret ; 0063 _ C3
; _asm_normalize10 End of function
[这是我的代码 ;-) 它可以工作并经过我的测试]
我不太了解 x86 程序集,我想对上述内容进行一些优化(纯 fpu 旧 asm,尤其是没有 sse,但比上面更优化)
特别是我想知道上面这个东西是否有一些蹩脚的编码:我在 fpu 堆栈上加载 xyz 向量然后计数 1/sqrt(x*x+y*y+z*z) 然后再次从 ram 加载 xyz 然后乘以值店铺 -
这是次优化吗,我应该尝试只加载 xyz 一次(而不是两次),然后将其保持在 fpu 堆栈计数上,然后存储在末尾?