3

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()」はスタック上にオブジェクトを作成してそのポインターを取得します。ポインターは関数へのパラメーターであり、オブジェクトは関数が戻った後に削除されます。

次に
、再帰関数を最適化したい。再帰関数を反復関数に変換し、スタックを使用して後で使用するデータをプッシュしたいと思います。スタック上にある再帰呼び出しの最大数がわからないため、配列を使用できません。

4

1 に答える 1

2

「ただ」プッシュアンドポップしたい場合は、間違いなくインラインアセンブラを使用する必要があります。

この方法でLLVMIRを拡張する場合は、最初にクリーンなセマンティクスを定義する必要があります。たとえば、これがバックエンドによって挿入されたスタックの動きとどのように相互作用するか、ポップなしで基本ブロックの中央を押すとどうなるかなどです。しかし、これは良い考えではないようです。なぜですか。これが必要ですか?

于 2011-05-31T06:11:42.877 に答える