LLVMアセンブリでプッシュ操作とポップ操作を実装したいと思います。LLVMアセンブリでプッシュ/ポップを実装する方法は?
alloca命令は、stack、push、popという概念に従いません。
例:
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
EDIT 1:私は必要
プラットフォームに依存しないソリューションです。
まず
私は一時的なオブジェクトを格納するスタックの先頭を使用します。
式「a * b + c * d + e * f」は、3つの乗算の結果を格納する必要があり、オペランドはクラスの大きなオブジェクトであり、演算子はオーバーロードされます。操作 "a * b"は多くの命令をとり、 "a"と "b"は乗算中に変更できません。つまり、 "a * b"の結果となるオブジェクトは "a" "b"。仮想的な言語のコードで
、
call_function(&Object(), &(a + b));
「&オブジェクト()」スタック上のオブジェクトを作成し、そのポインタを取得し、ポインタが関数のパラメータであり、オブジェクト意志関数が返った後で削除されます。
第2
再帰関数を最適化したい。再帰関数を反復関数に変換し、後で使用するデータをスタックにプッシュする必要があります。私はスタック上にある再帰呼び出しの最大数を知らないので、配列を使うことはできません。
プラットフォームに依存しないため、インラインアセンブラは使用できません。私はスタックで実験を行い、再帰関数を最適化したい。 – Squall
LLVM IRに「スタック」がないとすれば、あなたは不運です。これが再帰関数の最適化を妨げるわけではありませんが。 –