更新しました
アセンブリの 2 行目を実際に使用されているニーモニック ( mflr
) に変更し、下部に詳細情報を追加しました。
次のようなコード (gcc を使用) に出くわしました (言い換え):
#define SOME_MACRO( someVar ) \
do { \
__asm__ ( \
" b 0f\n" \
"0: mflr %0\n" \
: "=r"( someVar ) \
); \
} while(0)
... ここで、b
命令 (ppc) は短い jmp でmflr
あり、「リンク レジスタ」の内容を取得しています。これは、いくつかの点でプログラム カウンターに似ています。Intelコードでもこの種のものを見てきました(この質問で受け入れられた回答を参照)。
ブランチはノーオペレーションとして機能します...私の質問:これはどのような目的に役立ちますか?
分岐予測と関係があると思いますが、これまでのところ、検索中にこのイディオムを使用している人々のコードしか見つかりませんでした。
分岐予測の推測が間違っていたようです。 mflr
リンクレジスタの内容を取得します。
つまり、私の質問は次のようになります。なぜブランチが必要なのかということです。