HP-UX Itanium比较和交换

HP-UX Itanium Compare and Swap

本文关键字:交换 比较 Itanium HP-UX      更新时间:2023-10-16

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

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

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

第一个可能的解决方案是通过使用_Asm_cmpxchg(这里的文档)。我找不到要包含的头文件,也找不到如何让它编译。

第二个可能的解决方案是直接使用cmpxchg和cmpxchg8b命令编写我自己的内联程序集,但我也没能找到如何正确地做到这一点。我找到了各种各样的资源,其中大多数都是直接编写汇编,不适合我需要的处理器体系结构,或者没有显示足够具体的示例。

我在这里找到了更多关于cmpxchg和cmpxchg8指令的文档(以及tzcnt和lzcnt,这两个是很好的,但不是必需的)。如果您在谷歌浏览器中查看,cmpxchg的绝对页面值为234,cmpxchg8的绝对页面值为236。

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

uname -smr: HP-UX B.11.31 ia64

处理器型号: Intel(R) Itanium(R) Processor 9340

编译器- v

: aCC:惠普C/aC + + B3910B A.06.28

更新:我能够得到_Asm_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 */);
}