Reading Gauche/Reading Gauche 0.9/gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc/x86.h/AO_test_and_set_full の変更点



 #setlinebreak(on)
 #topicpath
 *AO_test_and_set_full [#wa0e8216]
 *概要 [#uf62534b]
 編集中。
 "xchgb %b0,%1" が実行されるアセンブリコード、"=q" (oldval), "=m" (*addr) が出力オペランド、"0" (0xff), "m"(*addr) が入力オペランドですね。
 
 "q" で自動割当されたレジスタ (eax,ebx,ecx,edx のいずれか) に 0 を代入して xchgb の第1引数として渡し、第2引数としてメモリ上の addr 変数を渡して xchgb を実行しています。xchgbで0とaddr変数の値を交換し、そして実行後のレジスタの値を oldval 変数で受け取ります。
 oldvalの値をAO_TS_VAL_t型でキャストし、0であれば0を、そうでなければ0xffを戻す。これによってロックされているか(非0の場合)、ロックされていないか(0の場合)を判定する。
 
  AO_INLINE AO_TS_VAL_t
  AO_test_and_set_full(volatile AO_TS_t *addr)
  {
   unsigned char oldval;
   /* Note: the "xchg" instruction does not need a "lock" prefix */
   __asm__ __volatile__("xchgb %0, %1"
 		: "=q"(oldval), "=m"(*addr)
 		: "0"(0xff), "m"(*addr) : "memory");
   return (AO_TS_VAL_t)oldval;
  }
 
 *調べるもの [#ee50ae1d]
 -[[Reading Gauche/Reading Gauche 0.9/gc/libatomic_ops-1.2/src/atomic_ops.h/AO_INLINE]]
 -[[Reading Gauche/Reading Gauche 0.9/gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/test_and_set_t_is_char.h/AO_TS_VAL_t]]
 -[[Reading Gauche/Reading Gauche 0.9/gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/test_and_set_t_is_char.h/AO_TS_t]]
 
 *参照元 [#le19cfbc]
 #related
 
 *コメント [#e6197b53]
 #pcomment(,1000,below,reply)

リロード   新規 編集 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.025 sec.