RISCは、「縮小命令セット」(通常、LOADレジスタ、STOREレジスタ、ADDレジスタ、CMPレジスタ、分岐条件付きレジスタなど)を意味します。
複雑な命令は、複雑な命令を実装するために使用される余分なロジックが、そのような複雑な命令を実行するために投資される場合は特に、単純な命令シーケンスでは達成できない有用な効果を得られないことがあります。簡単なRISC命令がより速く実行されます。
PUSHとPOPは基本的にSTORE/LOAD間接の単純な組み合わせであり、定数をレジスタに追加します。したがって、スタックポインタ用のレジスタを専用にすると、PUSHとPOPは簡単にシミュレートされ、高速のパイプラインマシンは対応するRISC命令と同じくらい高速にPUSHとPOPを実行できます。したがって、PUSHとPOPをCISC命令とみなすことが最も大切です。彼らは本当にあなたをたくさん買わない。
CALL(== PUSH PC + JMP)とRET(POP PC)を考えると、人生はもっと面白くなります。これらは、適切なRISCアーキテクチャでも簡単にシミュレートできます。しかし、POP PCは、新しいPCがどこにあるかを予測するのに苦労し、プリフェッチを行うことができないため、パイプラインバブルを招く。メモリが「遠く離れている」とすると、これはサブルーチンコールがたくさんあるコードでの主要なパフォーマンスの阻害要因になります。
ここでは、CISCに行きたいと思っています。あなたが本当に欲しいのは、リターンPCを予測する何らかの方法です。最新のCPUの多くは、ハードウェアに「シャドウコールスタック」を保持することでこれを行います。各CALLは、PCをメモリスタックにプッシュし、シャドウスタックにもプッシュします。各RETはメモリスタックからPCの値をポップしますが、シャドースタックの先頭のエントリを使用して命令ストリームのフローを予測します。シャドースタックは本質的にゼロアクセスになります(もちろんシャドースタックをポップします)。このようにして、命令ストリームは中断されず、したがってCISCマシンは性能上勝ちます。
(多くのレジスタを持つRISCマシンで、リーフ関数呼び出しをコンパイルして常にPCを保存するためにコンパイルしたものが、シャドウスタックほど効果的ではないかと思います。レジスタウィンドウ)。
これは、RISCとCISCがデザインのトレードオフを単純化することを示しています。あなたが望むのは、複雑さが実際にあなたに何かを買わない限り、単純です。たとえば、ハードウェアのIEEE浮動小数点数は、ロットで、RISC命令を使用するどのシミュレーションよりも高速です。
結果的に、最新のマシンは、RISCやCISCがきれいではありません。パフォーマンスプロファイリングが選択します。
アームは混在しており、それ以上のRISCではないと言います。 – user1998844
ARMは、特殊なPUSH/POP命令ではなく、単一の命令でプッシュまたはポップを実行することを常にサポートしています。自動ポストインクリメントおよびプリデクリメントアドレッシングモードによって実行されました。 –
x86/x86-64の場合、プッシュとポップは大幅に最適化されています。そのため、スタックポインタが連続してプッシュされる場合、スタックポインタへの依存性が特別な場合は特に最適化されます。第2回目のプッシュは、スタックポインタが最初のプッシュによって更新されるまで待機しません。プッシュは、単に(通常)プリデクリメントされたスタックポインタレジスタへのストアです。特定のアドレッシングモードを持つ店舗は、特にCISCまたはRISCですか?それは議論の余地がある。 – doug65536