除法最適化解除のメモのメモ

今日の#lowhacks @ irc.freenode.net [ log ]

via. d:id:h0shu:20080302

x86アセンブリC言語(ぽいの)に翻訳してみた

r0 = A; // mov r0, A
edx:eax = eax * r0; // imul r0   edxには上位32bitが入る。( edx = edx:eax >> 32 )
(signed)edx /= 2^B; // sar edx, B
r1 = edx; // mov r1, edx 
(unsigned)r1 /= 2^C; // shr r1, C
r1 += edx; // add r1, edx

これで全体としては

r1 = ((eax * A) >> 32 >> B) + ((eax * A) >> 32 >> B >> C);

という動作をする模様。

x86初心者の私はimul r0でedxに上位32bitが入るということに気づくのにかなり時間がかかった…。