命令の出現頻度
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命令ほどで構成されていることがわかります。
| 64bit | 32bit | |||||
|---|---|---|---|---|---|---|
| 命令 | 回数 | % | 命令 | 回数 | % | |
| 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 | |