vc編譯期的常量除法優(yōu)化
在vc release模式下調(diào)試時(shí),經(jīng)常可以看到下面形式的匯編代碼:
優(yōu)化方法是把除法轉(zhuǎn)換成乘以被除數(shù)然后右移.
x/y => x*(1 /y) => x* ((1<<37) /((1<<37)* y) ) =>x * ((1<<37)/ y)>>37
為了取整效果,最終結(jié)果將會(huì)是x/y = x * ((1<<37 +y-1 )/ y)>>37
由于y 是常量,在編譯期,編譯器就可以計(jì)算出((1<<37 +y-1 )/ y)的值。
那么實(shí)際計(jì)算時(shí),編譯期就可以把 x/y 轉(zhuǎn)換成 x *M >> 37, M = ((1<<37 +y-1 )/ y)
除以0x50 M = (1<<37 + 0x4F)/0x50 = 0x66666667
那么x / 0x50相當(dāng)于 (x* 0x66666667)>>37
00FB1202 mov ecx,dword ptr ds:[00FB543Ch]
00FB1208 sub ecx,dword ptr ds:[00FB5438h]
00FB120E mov eax,66666667h
00FB1213 imul ecx
00FB1215 sar edx,5
00FB1218 mov ecx,edx
00FB121A shr ecx,1Fh
00FB121D add ecx,edx
其實(shí)這是當(dāng)被除數(shù)是常量時(shí)除法的編譯器優(yōu)化。x/50h00FB1208 sub ecx,dword ptr ds:[00FB5438h]
00FB120E mov eax,66666667h
00FB1213 imul ecx
00FB1215 sar edx,5
00FB1218 mov ecx,edx
00FB121A shr ecx,1Fh
00FB121D add ecx,edx
優(yōu)化方法是把除法轉(zhuǎn)換成乘以被除數(shù)然后右移.
x/y => x*(1 /y) => x* ((1<<37) /((1<<37)* y) ) =>x * ((1<<37)/ y)>>37
為了取整效果,最終結(jié)果將會(huì)是x/y = x * ((1<<37 +y-1 )/ y)>>37
由于y 是常量,在編譯期,編譯器就可以計(jì)算出((1<<37 +y-1 )/ y)的值。
那么實(shí)際計(jì)算時(shí),編譯期就可以把 x/y 轉(zhuǎn)換成 x *M >> 37, M = ((1<<37 +y-1 )/ y)
除以0x50 M = (1<<37 + 0x4F)/0x50 = 0x66666667
那么x / 0x50相當(dāng)于 (x* 0x66666667)>>37
posted on 2009-02-23 00:16 clane 閱讀(1428) 評(píng)論(1) 編輯 收藏 引用 所屬分類: C++