次のコードは、インライン アセンブリを使用して結果を設定します。
uint64_t Foo::f() {
uint64_t result;
asm volatile
("vldmia %1, {q0-q1} \n" // q0-1 = *this
⋮
"vstmia %0, {d0} \n" // result = d0
:: "r"(&result), "r"(this)
: "q0", "q1");
return result;
}
変数はアセンブリ コードで無条件に設定されresult
ますが、Xcode のアナライザーはこれを無視しているようで (フロー分析は宣言から return ステートメントまで直接スキップします)、次のように文句を言います。
…/BitBoard.cpp:26:9: Undefined or garbage value returned to caller
初期化サイクルを無駄にすることなく、Analyzer を鎮圧する方法はありますresult
か?
編集:出力制約を指定する提案を試みました:
: "=r"(&result) : "r"(this), "r"(&result)
しかし、コンパイラは「asm出力の左辺値が無効です」と鳴きます。コンパイルを削除すると、&
一見ランダムな結果が返されます。vstmia %0, {d0}
への変更vmov %0, d0
も失敗し、「命令のオペランドが無効です」。
提案されているように、出力としてマークresult
し、アセンブリコードに別の方法で入力する必要があると思われますが、そうすることを知っている情報が見つかりません。