私は暗号化プログラムを作成していますが、コア (ワイド乗算ルーチン) は x86-64 アセンブリで作成されています。これは、速度と、adc
C から簡単にアクセスできないような命令を頻繁に使用するためです。インライン化したくありません。この関数は大きく、内側のループで数回呼び出されるためです。
理想的には、この関数のカスタム呼び出し規則も定義したいと思います。これは、内部ですべてのレジスタ ( を除くrsp
) を使用し、引数を上書きせず、レジスタに返すためです。現時点では、C 呼び出し規則に適合していますが、もちろんこれにより速度が低下します (約 10%)。
これを避けるために、私はそれを呼び出すことができますasm("call %Pn" : ... : my_function... : "cc", all the registers);
が、呼び出し命令がスタックを混乱させることをGCCに伝える方法はありますか? そうしないと、GCC はこれらすべてのレジスタをレッド ゾーンに配置し、一番上のレジスタが上書きされます。モジュール全体を -mno-red-zone でコンパイルできますが、GCC に、たとえば、レッド ゾーンの上位 8 バイトが上書きされて何も配置されないようにする方法を希望します。