x86命令の所要クロック計測スレ

このエントリーをはてなブックマークに追加
4001 ◆.MeromIYCE
>>393
乗算にしてくれるのはどういう場合だ?
もちろん除数は固定だろうが、被除数の範囲もある程度わかっていないと
精度保証ができないのでコンパイラにはきついのでは?

そう思ってやってみたら、VCは見事に乗算のコードを吐いてくれた。あはは。
mov eax, 0aaaaaaabh
mul edi
shr edx, 1
これで、edx=edi/3; となっている。
shr edx,1 は思いつかなかった。0aaaaaaabhを大きくとることで精度を上げている。
普通に考えると2^32/3を切り上げた55555556hを使ってしまうが、
これだと、edi>2^31かつedi%3==2のときに計算結果が1大きくなってしまう。
(「^」はxorじゃないよ。念のため)

mov eax, 40140141h ; r=esi/819とおく。esi=819r
mul esi ;edx=205r
sub esi, edx ;esi=614r
shr esi, 1 ;esi=307r
add esi, edx ;esi=512r
shr esi, 9 ;esi=r
これなんか、esi/=819; だぜ。人智を超えている。まあ、人智の生んだコンパイラだが。
40140141hは2^32*205/819で、205の大きさで精度を上げて9bitシフトで仕上げている。
一般的な式を出したいな。