c - Cインラインアセンブリ-'fst'のオペランドタイプが一致しません

c gcc assembly mingw inline-assembly

Cプログラムでアセンブリコードを書く方法を学ぼうとしています。アセンブリの整数は理解していますが、浮動小数点数は私をつまずき続けます。

double asmSqrt(double x) {
    double o;
    __asm__ ("fld %1;"
             "fsqrt;"
             "fst %0;"
             : "=g" (o)
             : "g"  (x)
    );
    return o;
}


ご覧のとおり、Imはxの平方根を見つけようとしています。しかし、コンパイルしようとすると、オペランドタイプの不一致エラーが発生します。

ここで使用したのと同じ構文に従いました:http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx?display=Print

PS:Windows XPでMinGW GCCを使用しています
答え
必要なfldおよびfst命令バリアントを明示的に指定する必要があります。それ以外の場合、コンパイラーは、オペランドのサイズを知らない。このコードは私にとってここで機能します:

__asm__ ("fldl %1  ;"
         "fsqrt    ;"
         "fstl %0  ;"
         : "=g" (o)
         : "g"  (x)
);


逆アセンブラを使用して、64ビットFLDおよびFST(DD/0およびDD/2)の正しいオペコードが発行されていることを再確認できます。
関連記事

c - wavを圧縮した後にクリックが発生するのはなぜですか?

c - Windows用の無料のCテストコードカバレッジツールはありますか?

c - 特定の文の単語を構成する文字を数える

mysql - CアプリケーションlibmysqlclientとODBC

c - conio.hにはtextcolor()が含まれていませんか?

c - glibを使用したCおよびdbus辞書

c - この重要でない変数がforループ内で初期化されるのはなぜですか?

c - strlenを使用してconst char *の長さを取得すると、負の数が返されますか?

c - 非常に少数のファイル記述子でepollを使用するメリットはありますか?

c - Linuxでの名前付きパイプとセマフォの操作