命令の出現頻度

ubuntu-8.10-desktop-amd64 の 64ビット版の bash-3.2.39 と gimp-2.6.1 で使用 (シェアドライブラリは除く)されている 762,506 命令を集計してみました。 nop命令は除き、Jcc、CMOVcc、SETcc は条件部分をまとめています。

比較のため ubuntu-8.04-desktop-x86 の 32ビット版の bash-3.2.33 と gimp-2.4.5 でも 826,488 命令を集計してみました。

x86系CPUは32ビットでも64ビットでも、メモリ/レジスタ間の転送に MOV 命令を使用するため、圧倒的に MOV 命令の 使用率が大きくなっています。64ビットでは関数の引数の受け渡しにスタックを用いないため、PUSH と POP の使用頻度が少なくなっています。 また浮動小数点演算について、gcc は 32ビットでは FPU を使うコードを生成し、64ビットでは SSE2 のコードを生成していることがわかります。

条件分岐命令(Jcc)を1種類と数えると、32ビットでも64ビットでも全体の 90% が 10命令ほどで構成されていることがわかります。

64bit32bit
命令回数% 命令回数%
mov 352576 46.24 mov 413508 50.03
call 100015 13.12 call 94591 11.44
Jcc 55026 7.22 Jcc 52908 6.40
test 34141 4.48 pop 33980 4.11
xor 32135 4.21 test 32943 3.99
jmp 26720 3.50 lea 25274 3.06
add 22108 2.90 push 25173 3.05
cmp 20422 2.68 jmp 24351 2.95
pop 19727 2.59 add 21217 2.57
push 14822 1.94 cmp 18371 2.22
lea 11901 1.56 sub 12937 1.57
movsd 11764 1.54 ret 11127 1.35
sub 11551 1.51 fstp 8408 1.02
ret 9939 1.30 xor 7265 0.88
movzx 4487 0.59 fld 6970 0.84
movsxd 2968 0.39 movzx 5269 0.64
xchg 2896 0.38 fild 1852 0.22
movapd 2134 0.28 and 1849 0.22
mulsd 1996 0.26 fldcw 1764 0.21
cvtsi2sd 1994 0.26 xchg 1724 0.21
addsd 1834 0.24 fxch 1641 0.20
and 1597 0.21 sar 1481 0.18
CMOVcc 1549 0.20 fnstsw 1359 0.16
ucomisd 1299 0.17 sahf 1348 0.16
SETcc 1240 0.16 fmul 1307 0.16
xorpd 1218 0.16 leave 1277 0.15
imul 1204 0.16 imul 1086 0.13
subsd 1157 0.15 or 1015 0.12
sar 1032 0.14 fadd 951 0.12
cvttsd2si 1013 0.13 fst 940 0.11
movss 930 0.12 fistp 862 0.10
or 848 0.11 shl 789 0.10
shl 834 0.11 shr 664 0.08
shr 767 0.10 fldz 644 0.08
divsd 748 0.10 sete 594 0.07
cdqe 631 0.08 fucom 580 0.07
movaps 471 0.06 fnstcw 560 0.07
movsx 407 0.05 setne 526 0.06
movq 317 0.04 faddp 515 0.06
sbb 248 0.03 fsub 479 0.06
neg 223 0.03 fucomp 465 0.06
cvtps2pd 216 0.03 not 459 0.06
cmps 206 0.03 movsx 361 0.04
xorps 184 0.02 sbb 351 0.04
idiv 174 0.02 fdiv 342 0.04
not 153 0.02 fld1 322 0.04
cvtsi2ss 153 0.02 movq 317 0.04
maxsd 145 0.02 adc 315 0.04
cvtpd2ps 141 0.02 fucompp 314 0.04
addss 137 0.02 fmulp 218 0.03
movs 136 0.02 fsubr 217 0.03
andpd 133 0.02 neg 212 0.03
unpcklps 119 0.02 cld 186 0.02
minsd 107 0.01 repz 168 0.02
movd 104 0.01 idiv 146 0.02
unpcklpd 96 0.01 fdivrp 134 0.02
mulss 93 0.01 fsubrp 120 0.01
ucomiss 72 0.01 fdivr 107 0.01
movdqu 60 0.01 movd 104 0.01
cvttss2si 58 0.01 fsubp 104 0.01
stos 57 0.01 fchs 100 0.01
paddw 57 0.01 fdivp 87 0.01
subss 55 0.01 fabs 87 0.01
por 55 0.01 div 72 0.01
div 55 0.01 movdqu 60 0.01
pandn 53 0.01 paddw 57 0.01
pand 53 0.01 setg 55 0.01
psubusb 50 0.01 por 55 0.01
divss 49 0.01 pandn 53 0.01
sqrtsd 48 0.01 pand 53 0.01
psubb 44 0.01 psubusb 50 0.01
punpcklbw 42 0.01 fsqrt 48 0.01
psrlw 40 0.01 psubb 44 0.01
pminub 36 0.00 punpcklbw 42 0.01
orpd 36 0.00 setle 40 0.00
emms 31 0.00 seta 40 0.00
andnpd 31 0.00 psrlw 40 0.00
punpckhbw 26 0.00 mul 40 0.00
packuswb 23 0.00 pminub 36 0.00
leave 21 0.00 emms 31 0.00
pmullw 20 0.00 rep 29 0.00
pcmpeqb 20 0.00 punpckhbw 26 0.00
fstp 18 0.00 setb 23 0.00
psubw 17 0.00 packuswb 23 0.00
mul 16 0.00 pmullw 20 0.00
maxss 16 0.00 pcmpeqb 20 0.00
cmpnltsd 16 0.00 fist 20 0.00
bswap 16 0.00 shrd 18 0.00
movntq 15 0.00 setl 17 0.00
cmpltsd 13 0.00 psubw 17 0.00
pxor 12 0.00 bswap 16 0.00
fld 11 0.00 movntq 15 0.00
adc 11 0.00 shld 12 0.00
paddusb 10 0.00 pxor 12 0.00
paddb 9 0.00 setge 11 0.00
minss 7 0.00 paddusb 10 0.00
rol 6 0.00 setbe 9 0.00
pmaxub 5 0.00 paddb 9 0.00
cwde 5 0.00 setae 7 0.00
fprem 3 0.00 bsr 7 0.00
fnstsw 3 0.00 pmaxub 5 0.00
cmpneqsd 3 0.00 setnp 2 0.00
cmplesd 3 0.00 ror 2 0.00
sqrtss 2 0.00 psllq 2 0.00
ror 2 0.00 hlt 2 0.00
psllq 2 0.00 cwde 2 0.00
hlt 2 0.00 setp 1 0.00
fldz 2 0.00
fld1 1 0.00
fild 1 0.00
cmpeqsd 1 0.00
TOTAL 762506 100.00 TOTAL 826488 100.00