はじめに
皆様ご存知のとおり、Visual Studioには逆アセンブラーがついてきます。
開発者コマンド プロンプトを立ち上げ、
dumpbin /DISASM /rawdata aaa.exe > aaa.asm
とするとアセンブリが吐かれます。
で、今回はCPU演算命令(instruction)をリストアップ&カウントアップしたいと思います。
最初は適当なテキストエディタでinstructionだけのリストを作ってからカウントアップしようかと思っていました。しかし今回解析するのが
https://github.com/TakeObara/DoNotPushGame
をx64 /arch=AVX2 /Ox /fp:fast
でPGOビルドしたものだったので、dumpbin.exeの出力が87.1MBとかなっており、適当なテキストエディタ(Sublime Text 3)には流石に荷が重かったのでdumpbin.exeの出力をそのまま放り込めるようにしました。
ソースコード
https://gist.github.com/yumetodo/b7d55812a719f8bc81cc
です。ファイル名とかをソースコードに埋め込んでしまったので適当に手直しして使ってください。
結果
超長いので
http://pastebin.com/utRZ6gKU
見てください。どんだけ命令あるんですかね。
抜粋すると
mov : 285897
add : 60998
cmp : 37286
movzx : 36338
lea : 36104
imul : 31387
call : 27917
sub : 25906
je : 22029
test : 20655
jne : 20402
and : 18440
jmp : 18348
xor : 15204
sar : 10689
pop : 9882
shr : 9359
inc : 8687
push : 8384
or : 8215
shl : 7077
movss : 6874
movsxd : 6146
nop : 5602
movaps : 4996
int : 4214
jle : 4030
dec : 3725
jl : 3069
jge : 3049
movups : 2950
mulss : 2444
movsd : 2359
addss : 1938
jae : 1776
jb : 1689
ja : 1608
mulsd : 1571
jg : 1547
movd : 1411
本当はここから、AVXとかの命令がどれくらい使われているのかを調べたかったんだけど、さくっと使えそうな命令一覧表がなかったので諦めましたが、チラホラとFMAやらAVXやらSSEやらの命令が見つかって満足したのでこれでいいものとします。コンパイルオプションのSIMD化なめちゃだめだなと。
更に解析したい人は
- http://softwaretechnique.jp/OS_Development/Tips/IA32_instructions.html
- http://www.officedaytime.com/tips/simd.html
- http://sky.geocities.jp/krypton_pl/x86/x86ext.htm
- http://wiki.onakasuita.org/pukiwiki/?よく使うASM命令ベスト100位に説明つけてみた
- Intel のあの馬鹿でかいPDF
とかで頑張ればいいんじゃないかな(諦め)