3

GCCドキュメントから

Intel x86では、force_align_arg_pointer属性を個々の関数定義に適用して、代替prologueを生成し、epilogueそれを再調整することができますruntime stack。これは、4バイトに整列されたスタックで実行されるレガシーコードと、16バイトのスタックを保持する最新のコードの混合をサポートしますSSE compatibility。代替プロローグとエピローグは通常のものよりも遅くて大きく、代替プロローグにはscratch register;が必要です。これにより、。と組み合わせて使用​​すると、使用可能なレジスタの数が減りますregparm attribute。このforce_align_arg_pointer属性はネストされた関数と互換性がありません。これはハードエラーと見なされます。

具体的には、プロローグ、エピローグ、およびSSEの互換性とは何ですか?

4

1 に答える 1

3

gccマニュアルから:

void TARGET_ASM_FUNCTION_PROLOGUE (FILE *file, HOST_WIDE_INT size)

プロローグは、スタックフレームの設定、フレームポインタレジスタの初期化、保存する必要のあるレジスタの保存、およびsizeローカル変数用の追加のストレージバイトの割り当てを担当します。fileアセンブラコードを出力するstdioストリームです。

「レジスタウィンドウ」を備えたマシンでは、関数呼び出しによって保持されることになっている場合でも、関数エントリコードはウィンドウにあるレジスタをスタックに保存しません。代わりに、関数で呼び出しに使用されていないレジスタが使用されている場合は、レジスタスタックを「プッシュ」するための適切な手順を実行します。

関数にフレームポインタがある場合とない場合があるマシンでは、関数エントリコードはそれに応じて変更する必要があります。フレームポインタが必要な場合は設定する必要があり、そうでない場合は設定しないでください。フレームポインタが必要かどうかを判断するために、マクロは変数を参照できますframe_pointer_needed。変数の値は1、フレームポインターを必要とする関数の実行時になります。

void TARGET_ASM_FUNCTION_EPILOGUE (FILE *file, HOST_WIDE_INT size)

定義されている場合、関数を終了するためのアセンブラーコードを出力する関数。エピローグは、関数が呼び出されたときに保存されたレジスタとスタックポインタをそれらの値に復元し、呼び出し元に制御を戻す役割を果たします。このマクロはマクロと同じ引数を取り、TARGET_ASM_FUNCTION_PROLOGUE復元するレジスタは同じ方法で決定さregs_ever_liveれます。CALL_USED_REGISTERS

SSE (Streaming SIMD Extensions)128ビットCPUレジスタのコレクションです。これらのレジスタには、4つの32ビットスカラーをパックできます。その後、4つの要素のそれぞれに対して同時に操作を実行できます。対照的に、同じことを行うには、通常のアセンブリで4回以上の操作が必要になる場合があります。

于 2012-12-13T13:49:22.440 に答える