【发布时间】:2015-08-20 01:50:59
【问题描述】:
我正在开发 C/C++ 跨平台代码,最后一个平台是基于 Itanium 的 HP-UX。相关机器和处理器信息可以在问题末尾找到。
我需要为下面给出的机器和编译器规范实现或找到原子比较和交换。
我找到了一些解决方案的可能性,但还没有找到如何使用它们。
第一个可能的解决方案是使用 _Asm_cmpxchg (documentation here)。我找不到为此包含的标头或如何编译它。
第二种可能的解决方案是直接使用 cmpxchg 和 cmpxchg8b 命令编写我自己的内联程序集,但我也无法找到正确执行此操作的方法。找了各种资源,大部分都是直接写汇编,不是针对我需要的处理器架构,或者没有给出足够具体的例子。
我找到了更多关于 cmpxchg 和 cmpxchg8 指令的文档(以及 tzcnt 和 lzcnt 这两个很好,但不是必需的)here。如果您在谷歌浏览器中查看,cmpxchg 的绝对页面值为 234,cmpxchg8 的绝对页面值为 236。
限制:由于我无法控制的限制,我无法使用第三方库。
uname -smr 的结果: HP-UX B.11.31 ia64
处理器型号: Intel(R) Itanium(R) 处理器 9340
编译器-v: aCC:HP C/aC++ B3910B A.06.28
更新:我能够编译 _Asm_cmpxchg,但它似乎不起作用(值保持不变)。对于参数,我为 _Asm_sz 传递了 _SZ_W,为 _Asm_sem 传递了 _SEM_ACQ,为 _Asm_ldhint 传递了 _LDHINT_NONE,为 r3 传递了一个指向原始 32 位整数值的指针,为 r2 传递了所需的新值。鉴于文档非常乏味,我猜测参数的含义。
【问题讨论】:
标签: c++ inline-assembly hp-ux itanium