HP-UX Itanium比较和交换

时间:2015-08-20 01:51:00

标签: c++ inline-assembly hp-ux itanium

我正在开发C / C ++跨平台代码,最后一个平台是基于Itanium的HP-UX。相关机器可以在问题的最后找到处理器信息。

我需要为下面给出的机器和编译器规范实现或找到原子比较和交换。

我找到了一些解决方案的可能性,但我们还没有找到如何使用它们。

第一种可能的解决方案是使用_Asm_cmpxchg(documentation here)。我无法找到要包含的标头或如何将其编译。

第二种可能的解决方案是直接使用cmpxchg和cmpxchg8b命令编写我自己的内联汇编,但我还没有找到如何正确执行此操作。我找到了各种资源,其中大部分是直接编写程序集,不是我需要的处理器体系结构,或者没有显示足够具体的示例。

我发现了更多关于cmpxchg和cmpxchg8指令的文档(以及tzcnt和lzcnt这两个很好,但不是必需的)here。如果您在Google Chrome浏览器中查看,则cmpxchg的abosulte页面值为234,cmpxchg8的页面值为236.

限制:由于我无法控制的限制,我无法使用第三方库。

uname -smr的结果: HP-UX B.11.31 ia64

处理器型号:英特尔(R)安腾(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传递了所需的新值。我猜测参数的含义,因为文档非常乏味。

1 个答案:

答案 0 :(得分:1)

我最终使用选项1找到了我自己的解决方案。下面是使其工作的示例代码:

>>> a, b = {}, 5
>>> a[b] = a, b
>>> a
{5: ({...}, 5)}
>>> a[b][0] is a
True