ここにはいくつかの追加の側面があります。
操作「a=b/c」を考えてみましょう。x86 はこれを次のように実装します。
mov eax,b
xor edx,edx
div dword ptr c
mov a,eax
div 命令の追加ボーナスとして、edx には残りが含まれます。
RISC プロセッサでは、最初に b と c のアドレスをロードし、b と c をメモリからレジスタにロードし、除算を行って a のアドレスをロードし、結果を格納する必要があります。Dst,src 構文:
mov r5,addr b
mov r5,[r5]
mov r6,addr c
mov r6,[r6]
div r7,r5,r6
mov r5,addr a
mov [r5],r7
ここでは通常、残りはありません。
ポインターを介して変数をロードする場合、両方のシーケンスが長くなる可能性がありますが、別のレジスターに 1 つ以上のポインターが既にロードされている可能性があるため、RISC の可能性は低くなります。x86 はレジスターが少ないため、ポインターがレジスターの 1 つに含まれる可能性は低くなります。
長所と短所:
RISC 命令は、命令スケジューリングを改善するために周囲のコードと混合される場合があります。これは、代わりに CPU 自体の内部でこの作業を行う (シーケンスに応じて多かれ少なかれうまくいく) x86 では可能性が低くなります。上記の RISC シーケンスは、通常、32 ビット アーキテクチャでは 28 バイト長 (それぞれ 32 ビット/4 バイト幅の 7 つの命令) になります。これにより、命令をフェッチするとき (7 回のフェッチ) にオフチップ メモリがより多く機能します。高密度の x86 シーケンスには含まれる命令が少なく、幅はさまざまですが、おそらく平均 4 バイト/命令も見られます。これを高速化する命令キャッシュがある場合でも、7 つのフェッチは、x86 と比較して他の場所で 3 つの不足を補う必要があることを意味します。
保存/復元するレジスタが少ない x86 アーキテクチャは、おそらく RISC よりも高速にスレッド スイッチを実行し、割り込みを処理することを意味します。保存および復元するレジスタが増えると、割り込みを行うためにより多くの一時的な RAM スタック スペースが必要になり、スレッドの状態を保存するためにより多くの永続的なスタック スペースが必要になります。これらの側面により、x86 は純粋な RTOS を実行するためのより良い候補になるはずです。
個人的な話ですが、RISC アセンブリを記述するのは x86 よりも難しいと思います。これを解決するには、RISC ルーチンを C で記述し、生成されたコードをコンパイルおよび変更します。これは、コード生成の観点からはより効率的ですが、実行の観点からはおそらく効率的ではありません。これら 32 のレジスタすべてを追跡します。x86 の場合は逆です。「実際の」名前を持つ 6 ~ 8 個のレジスタを使用すると、問題が管理しやすくなり、生成されたコードが期待どおりに機能するという確信が高まります。
醜い?それは見る人の目にある。私は「違う」ほうが好きです。