2

この質問を考慮して:Xcode LLVMでLOOPに関するインラインアセンブリコードを作成する方法は?

これは、次のインラインアセンブリコードで回答されます。

void brighten_neon(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
              "\t mov r4, #0\n"
              "\t vdup.8 d1, %3\n"
              "Lloop2:\n"
              "\t cmp r4, %2\n"
              "\t bge Lend2\n"
              "\t vld1.8 d0, [%0]!\n"
              "\t vqadd.s8 d0, d0, d1\n"
              "\t vst1.8 d0, [%1]!\n"
              "\t add r4, r4, #8\n"
              "\t b Lloop2\n"
              "Lend2:\n"
              : "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
              : "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
              : "cc", "r4", "d1", "d0");
}

アセンブリコードの最後の3行はどういう意味ですか?ここでは、インラインで使用されているレジスタ名などでパラメータが定義されているようです。誰かがこれについて詳しく説明できますか?誰かがこれを説明する良いリソースを知っていますか?

4

1 に答える 1

4

特に ARM アセンブリについてはよくわかりませんが、GCC のインライン アセンブリ構文では、3 つのセクションはそれぞれ、出力レジスタ、入力レジスタ、破壊されたレジスタです。レジスタは出現順に番号が付けられており、この場合、入力レジスタは出力レジスタと同じ変数を同じ順序で参照します。=rアーキテクチャ固有ですが、おそらく「任意の汎用レジスタ」のようなものを意味します。

したがって、コンパイラが 4 つの変数を配置するのに便利な 4 つのレジスタを選択し (おそらく ARM 呼び出し規約がそれらを配置するものでしょうか?)、必要に応じて , , が確実にcc保存r4d1れるd0ことを期待できます。アセンブリで%0、、、、%1%2使用して 4 つのレジスタを参照できます。%3次に、コンパイラは、終了時に他のレジスタを破壊していないこと、および変数の新しい値が新しいレジスタにあることを期待できます (これはたまたまこのレジスタの古いレジスタと同じです)。場合)。

GCC-Inline-Assembly-HOWTOも参照してください。少し古いですが、そこから一般的なアイデアを得ることができるはずです。

于 2012-11-25T00:47:14.450 に答える