FrontPage開発メモ

開発メモ/アセンブラ/その他


共通

  • 大体の最近のx86プロセッサ(少なくともIntel系)。ALUが3つ(Pen4は4つ)、Load/Storeが1つ。詳しくはここを見て。
    • AMD系に関しては調べてないが、一部の資料を見る限り、そんなに変んねーんじゃねーかなー。と言う気がする。(基本的に追随状態?)


普通のアセンブラ

  • nopってALUで処理されるらしい。面白い。
  • 「mov edx, a; nop; nop; nop」が1命令辺り0.25クロック(つまり左のコード全てが1クロックで終わる)、それに対し「mov edx, eax; nop; nop; nop」が0.33クロック。・・・かと思えば、「mov edx, a」の連続が1クロック、に対し「mov edx, eax;」の連続が0.33クロックで終わる・・・よくわからない・・・
    • ふと思った。もしかしてレジスタ同士のmovってALUでやってる・・・?そうか。「mov edx, a;」はLoad。「mov edx, eax」はALUでやってALUは3基あるから最大0.33か・・・なるほどなるほど。
      • 「mov esi, a; mov eax, edx; mov ebx, edx; mov ecx, edx;」これが全部1クロック(つまり一つ辺り0.25クロック)で終わった。やっぱ↑で正しいっぽい。


SIMD命令

  • movapsは1クロックだがmovupsは2クロック
  • movapsの場合も、普通のアセンブラのmov同様、XMMレジスタ同士の場合にはALUで処理されるらしく、最小0.33CPIいける。
  • 最小でも1クロック掛る命令(試してみた奴)
    • mulps(パックド浮動小数点乗算x4), addps(パックド浮動小数点加算x4), pmuludq(パックド符号なしダブルワード整数を乗算)
  • 最小0.5クロック
    • paddb(パックド整数加算x4)

難しい奴は1クロック。簡単な奴であれば0.5クロックで行けるのもある・・・ってことかな・・・?(難しい奴はALU3つを駆使して計算するとかかもしれない)

  • 二つ目の引数としてメモリ上の変数を指定できる命令。・・・絶対メモリ上の変数を指定する事無かれ。180clockくらい掛るwwww(mov系は除く)(なんでこんな掛るんだろね・・・幾らなんで掛りすぎだろ・・・)一度xmmに入れてから計算すべし・・・