私は以前にこの種のことを行ったことがあり、その方法はマクロを使用していましたが、その方法で行うと、大量のコードの重複が発生し、CPU キャッシュがオーバーフローして処理が遅くなります。今日それを行うとしたら、あいまいな/まれなオペコードを除いて、「オペコード スイッチ/ジャンプ可能」イディオム全体を取り除き、いくつかの小さなルックアップ テーブルを使用して、通常の算術演算/論理演算すべてに共通のブランチレス コードを記述します。オペコード番号。次のように考えてください。
operand1 = regs[operand1_table[opcode]];
operand2 = regs[operand2_table[opcode]];
res[ADD] = operand1+operand2;
res[SUB] = operand1-operand2;
res[OR] = operand1|operand2;
/* ... */
regs[dest_table[opcode]] = res[optype_table[opcode]];
もちろん、このコードは単純化しすぎていますが、拡張してメモリ オペランドなどを処理することもできます。また、ジャンプ命令は、プログラム カウンタをオペランドの 1 つとして使用する単なる加算命令であることに注意してください。
Z80 (またはその GB バリアント) や x86 などの CISC アーキテクチャの場合、条件コード フラグも処理する必要があります。ただし、それらは上記のような計算の 2 番目のセットとして実行できますres[...] = ...;
。