LLVMアセンブリにプッシュおよびポップ操作を実装したいと思います。
alloca命令は、スタック、プッシュ、およびポップの概念に従いません。
例:
PUSH
x86
subl $4, %esp
movl %eax, 0(%esp)
また
pushl %eax
mips
addi $sp, $sp, -4
sw $t2, 0($sp)
POP
x86
movl 0(%esp), %eax
addl $4, %esp
また
popl %eax
mips
lw $t2, 0($sp)
addi $sp, $sp, 4
編集1:
プラットフォームに依存しないソリューションが必要です。
まず
、スタックの一番上を使用して一時オブジェクトを格納します。
式"a* b + c * d + e * f"は、3回の乗算の結果を格納する必要があります。オペランドはクラスの大きなオブジェクトであり、演算子はオーバーロードされています。演算「a*b」は多くの命令を取ります。「a」と「b」は乗算中に変更できません。つまり、「a * b」から生じるオブジェクトは、「a」または「a」と同じメモリ位置を使用できません。 「b」。
架空の言語のコードでは、
call_function( &Object(), &(a + b) );
「&Object()」はスタック上にオブジェクトを作成してそのポインターを取得します。ポインターは関数へのパラメーターであり、オブジェクトは関数が戻った後に削除されます。
次に
、再帰関数を最適化したい。再帰関数を反復関数に変換し、スタックを使用して後で使用するデータをプッシュしたいと思います。スタック上にある再帰呼び出しの最大数がわからないため、配列を使用できません。