GCC内建原子操作

来源:互联网 发布:银魂中空知大猩猩 编辑:程序博客网 时间:2024/05/17 14:27

参见:http://gcc.gnu.org/onlinedocs/gcc/_005f_005fsync-Builtins.html

The following built-in functionsare intended to be compatible with those describedin the Intel Itanium Processor-specific Application Binary Interface,section 7.4. As such, they depart from the normal GCC practice of usingthe ‘__builtin_’ prefix, and further that they are overloaded such thatthey work on multiple types.

The definition given in the Intel documentation allows only for the use ofthe types int, long, long long as well as their unsignedcounterparts. GCC allows any integral scalar or pointer type that is1, 2, 4 or 8 bytes in length.

Not all operations are supported by all target processors. If a particularoperation cannot be implemented on the target processor, a warning isgenerated and a call an external function is generated. The externalfunction carries the same name as the built-in version,with an additional suffix‘_n’ where n is the size of the data type.

In most cases, these built-in functions are considered a full barrier. That is,no memory operand is moved across the operation, either forward orbackward. Further, instructions are issued as necessary to prevent theprocessor from speculating loads across the operation and from queuing storesafter the operation.

All of the routines are described in the Intel documentation to take“an optional list of variables protected by the memory barrier”. It'snot clear what is meant by that; it could mean that only thefollowing variables are protected, or it could mean that these variablesshould in addition be protected. At present GCC ignores this list andprotects all variables that are globally accessible. If in the futurewe make some use of this list, an empty list will continue to mean allglobally accessible variables.

type __sync_fetch_and_add (type *ptr, type value, ...)
type __sync_fetch_and_sub (type *ptr, type value, ...)
type __sync_fetch_and_or (type *ptr, type value, ...)
type __sync_fetch_and_and (type *ptr, type value, ...)
type __sync_fetch_and_xor (type *ptr, type value, ...)
type __sync_fetch_and_nand (type *ptr, type value, ...)
These built-in functions perform the operation suggested by the name, andreturns the value that had previously been in memory. That is,
          { tmp = *ptr; *ptr op= value; return tmp; }          { tmp = *ptr; *ptr = ~(tmp & value); return tmp; }   // nand

Note: GCC 4.4 and later implement __sync_fetch_and_nandas *ptr = ~(tmp & value) instead of *ptr = ~tmp & value.

type __sync_add_and_fetch (type *ptr, type value, ...)
type __sync_sub_and_fetch (type *ptr, type value, ...)
type __sync_or_and_fetch (type *ptr, type value, ...)
type __sync_and_and_fetch (type *ptr, type value, ...)
type __sync_xor_and_fetch (type *ptr, type value, ...)
type __sync_nand_and_fetch (type *ptr, type value, ...)
These built-in functions perform the operation suggested by the name, andreturn the new value. That is,
          { *ptr op= value; return *ptr; }          { *ptr = ~(*ptr & value); return *ptr; }   // nand

Note: GCC 4.4 and later implement __sync_nand_and_fetchas *ptr = ~(*ptr & value) instead of*ptr = ~*ptr & value.

bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
These built-in functions perform an atomic compare and swap. That is, if the currentvalue of *ptr is oldval, then write newval into*ptr.

The “bool” version returns true if the comparison is successful andnewval is written. The “val” version returns the contentsof *ptr before the operation.

__sync_synchronize (...)
This built-in function issues a full memory barrier.
type __sync_lock_test_and_set (type *ptr, type value, ...)
This built-in function, as described by Intel, is not a traditional test-and-setoperation, but rather an atomic exchange operation. It writes valueinto *ptr, and returns the previous contents of*ptr.

Many targets have only minimal support for such locks, and do not supporta full exchange operation. In this case, a target may support reducedfunctionality here by which the only valid value to store is theimmediate constant 1. The exact value actually stored in *ptris implementation defined.

This built-in function is not a full barrier,but rather an acquire barrier. This means that references after the operation cannot move to (or bespeculated to) before the operation, but previous memory stores may notbe globally visible yet, and previous memory loads may not yet besatisfied.

void __sync_lock_release (type *ptr, ...)
This built-in function releases the lock acquired by__sync_lock_test_and_set. Normally this means writing the constant 0 to *ptr.

This built-in function is not a full barrier,but rather a release barrier. This means that all previous memory stores are globally visible, and allprevious memory loads have been satisfied, but following memory readsare not prevented from being speculated to before the barrier.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手表忘了密码怎么办 苹果系统忘了密码怎么办 ps画板建小了怎么办 wps表格密码忘了怎么办 word文档变成虚的怎么办 wps论文中表格跨页怎么办 word文档复制过来有边框怎么办 wps表格跨页断开怎么办 锅的铆钉老是松怎么办 文胸不知道怎么染色了怎么办 未后的信息我该怎么办? 做leep手术后大出血怎么办 眼线笔出不了水怎么办 手机字体变成空心字怎么办 平安树树枝黑了怎么办 柳树被虫钻洞了怎么办 柳树叶子上有虫子怎么办 小金鱼翻肚皮了怎么办 秋天树叶没了小鸟怎么办 去国外旅游不会英语怎么办 橡皮树长了2米高怎么办 榕树盆景长的高怎么办? 2岁宝宝看书弯腰低头怎么办 excel表格打开很慢怎么办 3d模型有红线框怎么办 电视页面加载时错误怎么办 投屏显示加载视频错误怎么办 word遇到问题需要关闭怎么办 画眼线看不出来怎么办 14岁眼皮很松怎么办啊 ps存不了psd格式怎么办 花草上有白色物怎么办 ps抠出来有白边头发怎么办 脸上结痂掉了有红印怎么办 海棠花瓣干枯怎么办茎变软 微信上的图片打不开怎么办 口红吊兰老掉叶子怎么办 翠叶竹芋叶子卷怎么办 牙有龋齿垫底以后酸怎么办 事业单位辞职请示30天不批怎么办 孕早期吃了油菜怎么办