冗長なスタック命令の削除
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/16 15:31 UTC 版)
「のぞき穴的最適化」の記事における「冗長なスタック命令の削除」の解説
コンパイラがサブルーチンの呼び出し前にレジスタの値をスタックへと退避させて呼び出し後に復元している場合、連続的なサブルーチンの呼び出しにおいて冗長なスタック命令が発生することがある。 コンパイラが以下のようなZ80向け命令列をプロシージャ呼び出しのたびに生成したとする。 PUSH AF PUSH BC PUSH DE PUSH HL CALL _ADDR POP HL POP DE POP BC POP AF 例えばサブルーチン呼び出しが2回ある場合は、以下のようになる。 PUSH AF PUSH BC PUSH DE PUSH HL CALL _ADDR1 POP HL POP DE POP BC POP AF PUSH AF PUSH BC PUSH DE PUSH HL CALL _ADDR2 POP HL POP DE POP BC POP AF 一般にすぐ後でPUSHするレジスタをPOPする命令は冗長である。実際に冗長な命令だった場合、のぞき穴的最適化でこの命令は削除される。この例では、冗長な隣り合うPOP・PUSH命令が現れた場合、それらを順に削除していく。冗長なコードをすべて削除すると、最終的に以下のようなコードになる。 PUSH AF PUSH BC PUSH DE PUSH HL CALL _ADDR1 CALL _ADDR2 POP HL POP DE POP BC POP AF
※この「冗長なスタック命令の削除」の解説は、「のぞき穴的最適化」の解説の一部です。
「冗長なスタック命令の削除」を含む「のぞき穴的最適化」の記事については、「のぞき穴的最適化」の概要を参照ください。
- 冗長なスタック命令の削除のページへのリンク