c++ - HP-UX Itanium 比较和交换

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

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

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

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

第一个可能的解决方案是使用 _Asm_cmpxchg ( documentation here )。我找不到要为此包含的 header 或如何让它编译。<​​/p>

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

我找到了更多关于 cmpxchg 和 cmpxchg8 指令的文档(以及 tzcnt 和 lzcnt,这两个指令很不错,但不是必需的)here .如果您在谷歌浏览器中查看,abosulte 页面值对于 cmpxchg 为 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 自行找到了解决方案。下面是让它工作的示例代码:

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 */);
}

关于c++ - HP-UX Itanium 比较和交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32108320/

相关文章:

python - 如何为 Python Swigged C++ 对象创建和分配回调函数

c - C语言__asm__使用WTO写多行报文

shell - bash 中的 `modpath` 在 csh 中相当于什么?

c - event_new() 函数在 hpux itanium 上失败

c++ - 在 Visual C++ 中禁用#pragma message ("...")?

当类成员隐藏其父类的类成员时,C++ 会生成警告吗?

c++ - 将 vector 附加到 vector

c - 为什么asm代码在C中的函数比c代码函数花费更多的时间?

gcc - x86 fbstp指令的C内联汇编

linux - 用于远程复制然后处理文件的Shell脚本