読者です 読者をやめる 読者になる 読者になる

linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

アセンブラ命令 - __GEN_RMWcc()

概要

任意のアセンブラ命令を実行し、実行結果を返す

詳細

このマクロでは以下の引数を受け取る

  • アセンブラ命令を示す文字列 : fullop
  • アセンブラ命令の実行対象を示す変数へのポインタ : var
  • 返り値の判断に使用するsuffix : cc

CC_HAVE_ASM_GOTOが有効な場合はインラインアセンブラでgoto文が使用できるため、asm_volatile_goto()でgoto文を使用したインラインアセンブラを生成するが、無効な場合は通常のインラインアセンブラを使用する

このとき、返り値の判断には以下の文字列で示されるアセンブラ命令を実行する

  • 有効
    • "j" + cc
    • goto命令が使用可能なためfullopの結果がフラグレジスタの状態と上記命令の条件に合致する場合は、cc_labelラベルにjumpし1を返しそうでない場合は0を返す
  • 無効
    • "set" + cc
    • goto命令が使用不可能なためfullopの結果がフラグレジスタの状態と上記命令の条件に合致する場合は、出力引数に1をそうでない場合は0を保存する

尚、いずれの場合においてもfullopオペランドvarで示される第0オペランドとなる

また、goto文が使用可能な場合はメモリへの書き込みが不要になるため、その分動作速度が高速になる