- 注册时间
- 2007-12-26
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 92615
- 在线时间
- 小时
|
发表于 2009-2-17 22:03:38
|
显示全部楼层
我写的三个ALU汇编版本
- __declspec(naked)
- UINT32 __fastcall iSqrt_ALU( UINT32 n )
- {
- __asm push esi;
- __asm push edi;
- __asm xor eax, eax;
-
- #if 1 /* Ver1: 指令数最少,但含跳转 */
-
- #define SQRT_CORE_ASM(x) \
- __asm lea edx, [eax+(1UL<<(x))] \
- __asm shr eax, 1 \
- __asm cmp ecx, edx \
- __asm jb L_##x \
- __asm sub ecx, edx \
- __asm add eax, (1UL<<(x)) \
- __asm L_##x:
-
- #elif 0 /* Ver2: 常规指令,无跳转 */
-
- #define SQRT_CORE_ASM(x) \
- __asm mov edi, 1UL<<(x) \
- __asm lea edx, [eax+edi] \
- __asm shr eax, 1 \
- __asm cmp ecx, edx \
- __asm sbb esi, esi \
- __asm not esi \
- __asm and edx, esi \
- __asm and edi, esi \
- __asm sub ecx, edx \
- __asm add eax, edi
-
- #else /* Ver3: 含CMOVcc指令,无跳转 */
-
- #define SQRT_CORE_ASM(x) \
- __asm lea edx, [eax+(1UL<<(x))] \
- __asm shr eax, 1 \
- __asm mov esi, ecx \
- __asm sub ecx, edx \
- __asm lea edi, [eax+(1UL<<(x))] \
- __asm cmovb ecx, esi \
- __asm cmovae eax, edi
-
- #endif
-
- SQRT_CORE_ASM(30);
- SQRT_CORE_ASM(28);
- SQRT_CORE_ASM(26);
- SQRT_CORE_ASM(24);
- SQRT_CORE_ASM(22);
- SQRT_CORE_ASM(20);
- SQRT_CORE_ASM(18);
- SQRT_CORE_ASM(16);
- SQRT_CORE_ASM(14);
- SQRT_CORE_ASM(12);
- SQRT_CORE_ASM(10);
- SQRT_CORE_ASM(8);
- SQRT_CORE_ASM(6);
- SQRT_CORE_ASM(4);
- SQRT_CORE_ASM(2);
- SQRT_CORE_ASM(0);
-
- #undef SQRT_CORE_ASM
-
- __asm pop edi;
- __asm pop esi;
- __asm ret;
- }
复制代码 其对应的C代码是一样的,只是采用了不同的汇编手法。
测试结果如下:n: 0-0x10000
iSqt_ref#: 0.00098 s
iSqt_c1_lbc#: 0.00071 s
iSqt_c2_lbc#: 0.00133 s
iSqt_FPU1_lbc#: 0.00092 s
iSqt_FPU2_lbc#: 0.00134 s
iSqt_FPU3_lbc#: 0.00118 s
iSqt_FPU_yaos#: 0.00217 s
iSqt_FPU1_yaos#: 0.00217 s
iSqt_FPU2_yaos#: 0.00208 s
iSqt_gxq_c#: 0.00140 s
iSqt_GxQ_asm#: 0.00471 s
iSqt_ALU_v1#: 0.00115 s
iSqt_ALU_v2#: 0.00580 s
iSqt_ALU_v3#: 0.00426 s
iSqt_16#: 0.00298 s
n: 0-0x4000000
iSqt_ref#: 1.03851 s
iSqt_c1_lbc#: 2.05060 s
iSqt_c2_lbc#: 1.94235 s
iSqt_FPU1_lbc#: 0.99109 s
iSqt_FPU2_lbc#: 1.41954 s
iSqt_FPU3_lbc#: 1.24257 s
iSqt_FPU_yaos#: 2.31683 s
iSqt_FPU1_yaos#: 2.38967 s
iSqt_FPU2_yaos#: 2.22774 s
iSqt_gxq_c#: 1.11229 s
iSqt_GxQ_asm#: 5.01363 s
iSqt_ALU_v1#: 1.17843 s
iSqt_ALU_v2#: 6.18305 s
iSqt_ALU_v3#: 4.54953 s
iSqt_16#: 2.95849 s
测试平台为:Windows XP SP3, P4 2.93GHz |
|