- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
楼主 |
发表于 2009-2-12 17:07:17
|
显示全部楼层
-
- double b32[] = {0.0,4294967296.0};
-
- __declspec(naked)
- DWORD __fastcall iSqrt_FPU(DWORD n)
- {
- __asm
- {
- push ecx
- sub esp, 4
- fnstcw word ptr [esp]
- mov edx, dword ptr [esp]
- or dword ptr [esp], 0x0C00
- mov eax, ecx
- and eax, 0x80000000
- shr eax, 31
- fld qword ptr [b32 + eax * 8]
- fild dword ptr [esp + 4]
- faddp st(1), st
- fsqrt
- fldcw word ptr [esp]
- fistp dword ptr [esp + 4]
- mov dword ptr [esp], edx
- fldcw word ptr [esp]
- add esp, 4
- pop eax
- ret
- }
- }
-
- __declspec(naked)
- DWORD iSqrt_FPU1(DWORD n)
- {
- __asm
- {
- sub esp, 4
- fnstcw word ptr [esp]
- mov edx, dword ptr [esp]
- or dword ptr [esp], 0x0C00
- mov eax, [esp + 8]
- and eax, 0x80000000
- shr eax, 31
- fld qword ptr [b32 + eax * 8]
- fild dword ptr [esp + 8]
- faddp st(1), st
- fsqrt
- fldcw word ptr [esp]
- fistp dword ptr [esp + 8]
- mov dword ptr [esp], edx
- fldcw word ptr [esp]
- add esp, 4
- mov eax, [esp + 4]
- ret
- }
- }
-
- __declspec(naked)
- DWORD __fastcall iSqrt_FPU2(DWORD n)
- {
- __asm
- {
- push ecx
- mov eax, ecx
- and eax, 0x80000000
- shr eax, 31
- fld qword ptr [b32 + eax * 8]
- fild dword ptr [esp]
- faddp st(1), st
- fsqrt
- sub esp, 8
- fstp qword ptr [esp]
- mov edx, dword ptr [esp + 4]
- mov eax, edx
- and edx,0x7ff00000
- and eax,0xfffff
- shr edx, 20
- or eax, 0x100000
- xchg ecx, edx
- sub ecx, 1043
- neg ecx
- shr eax, cl
- xchg edx, ecx
- add esp, 12
- or ecx, ecx
- cmove eax, ecx
- ret
- }
- }
-
复制代码 比较时间
FPU2 < FPU < FPU1
另外,程序开始就改变RC的
会造成函数结果错误
输入小的时候测试不到 |
|