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


Top / Reading Gauche / Reading Gauche 0.9 / gc / libatomic_ops-1.2 / src / atomic_ops / sysdeps / gcc / x86.h / AO_test_and_set_full

AO_test_and_set_full

概要

"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;
}

調べるもの

参照元

コメント

コメントはありません。 コメント/Reading Gauche/Reading Gauche 0.9/gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc/x86.h/AO_test_and_set_full?

お名前:

MENU

now: 5

リンク


最新の20件
2020-05-27 2020-05-22 2020-05-14 2020-05-12 2020-05-10 2020-04-27 2020-03-23
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 1567, today: 1, yesterday: 1

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

Last-modified: 2010-01-16 (土) 20:08:00 (3786d);  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.030 sec.