C++ HP-UX安腾比较和交换

C++ HP-UX安腾比较和交换,c++,inline-assembly,hp-ux,itanium,C++,Inline Assembly,Hp Ux,Itanium,我正在开发C/C++跨平台代码,最后一个平台是基于安腾的HP-UX。相关机器和处理器信息可在问题末尾找到 我需要实现或找到下面给出的机器和编译器规范的原子比较和交换 我已经找到了一些解决方案的可能性,但还没有找到如何使用它们 第一种可能的解决方案是使用_Asm_cmpxchg()。我找不到要包含的标题,也找不到如何编译它 第二种可能的解决方案是直接使用cmpxchg和cmpxchg8b命令编写自己的内联程序集,但我也没有找到正确的方法。我发现了各种各样的资源,其中大多数都是直接编写汇编,而不是针

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

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

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

第一种可能的解决方案是使用_Asm_cmpxchg()。我找不到要包含的标题,也找不到如何编译它

第二种可能的解决方案是直接使用cmpxchg和cmpxchg8b命令编写自己的内联程序集,但我也没有找到正确的方法。我发现了各种各样的资源,其中大多数都是直接编写汇编,而不是针对我需要的处理器体系结构,或者没有给出足够具体的示例

我找到了更多关于cmpxchg和cmpxchg8指令的文档(以及tzcnt和lzcnt,这两个指令很好,但不是必需的)。如果您在google chrome中查看,则cmpxchg的结果页面值为234,cmpxchg8的结果页面值为236

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

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

处理器型号:英特尔(R)安腾(R)处理器9340

编译器-v:附件:HP C/aC++B3910B A.06.28


更新:我能够编译_Asm\u cmpxchg,但它似乎不起作用(值保持不变)。对于参数,我为Asm_SZ传递了_SZ_W,为Asm_SEM传递了_SEM_ACQ,为Asm_LDHINT传递了_LDHINT_NONE,为r3传递了指向原始32位整数值的指针,为r2传递了所需的新值。我在猜测参数的含义,因为文档非常平淡。

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

bool compare_and_swap(unsigned int* var, unsigned int oldval, unsigned int newval)
{
    // Move the old value into register _AREG_CCV because this is the register
    // that var will be compared against
    _Asm_mov_to_ar(_AREG_CCV, oldval);
    // Do the compare and swap
    return oldval == _Asm_cmpxchg(
        _SZ_W /* 4 byte word */, 
        _SEM_ACQ /* acquire the semaphore */, 
        var, 
        newval, 
        _LDHINT_NONE /* locality hint */);
}