1

GCC の拡張 asm 構文を使用して、(ARM のようなアーキテクチャの) 次のアセンブリ命令を埋め込もうとしています。

__asm__("lsr  %[xj], %[xj], %[xn]" : 
            [xj] "=r" (j) : 
            [xi] "[xj]" (j) , [xn] "[xn]" (n)); // j = j >> n

ij、およびnは整数として宣言されていますint i, j, n;

( inパラメータとoutjパラメータの両方として機能することに注意してください)

コンパイラは次のエラーを生成します。

../src/fft2dlib.c:55:5: error: matching constraint references invalid operand number
../src/fft2dlib.c:53:3: error: matching constraint references invalid operand number

ここで、53 行目と 55 行目は、上記の asm コードの 1 行目と 3 行目です。

アセンブリ命令で入力パラメーターを明示的な定数に置き換えるnと、正常にコンパイルされます。

__asm__("lsr  %[xj], %[xj], 27" : 
            [xj] "=r" (j) : 
            [xi] "[xj]" (j)); // j = j >> 27

GCC マニュアルの例に従っていますが、問題がわかりません。

4

1 に答える 1

3

の制約"[xn]"[xn] "[xn]" (n)実際には意味がありません。パラメータ名または番号を制約として使用することは、「このオペランドを名前付きオペランドと同じ場所に置く」ことを意味します。したがって、この場合、GCC に[xn]と同じ場所に配置するように指示していますが[xn]、これは意味がなく、実際にはオペランドの型に関する情報を提供しません。

"r"アセンブリ命令が許可するものに応じて、レジスタ オペランドなどの別の制約タイプを使用する必要があります。

于 2012-05-23T16:58:07.673 に答える