2011-05-30 14 views
3

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
再帰関数を最適化したい。再帰関数を反復関数に変換し、後で使用するデータをスタックにプッシュする必要があります。私はスタック上にある再帰呼び出しの最大数を知らないので、配列を使うことはできません。

答えて

2

"ちょうど"プッシュしてポップしたい場合は、間違いなくインラインアセンブラを使用してください。

この方法でLLVM IRを拡張する場合は、最初にクリーンセマンティクスを定義する必要があります。例えば。どのようにこれはバックエンドによって挿入されたスタックの動きと対話する必要があります、あなたは基本的なブロックの中で任意のポップなどを使用してプッシュしている場合はどうなりますか?しかし、これは良い考えではないようですこれはまったく必要ですか?

+0

プラットフォームに依存しないため、インラインアセンブラは使用できません。私はスタックで実験を行い、再帰関数を最適化したい。 – Squall

+2

LLVM IRに「スタック」がないとすれば、あなたは不運です。これが再帰関数の最適化を妨げるわけではありませんが。 –

関連する問題