0

更新しました

アセンブリの 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リンクレジスタの内容を取得します。

つまり、私の質問は次のようになります。なぜブランチが必要なのかということです。

4

1 に答える 1