You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86-64下是否存在匹配32位有符号立即数的内联汇编约束?

x86-64内联汇编约束:匹配32位有符号立即数的需求

我需要在x86-64平台找到一种类似"i"的内联汇编约束,仅匹配能放入32位有符号立即数的操作数。

具体需求是实现atomic_add函数:

  • 当操作数v属于32位有符号立即数范围时,GCC生成lock add mem, imm指令
  • 当v超出该范围时,使用"r"约束生成mov r, imm; lock add mem, r指令

当前代码在v为非常量或符合范围的常量时可正常工作,但v为超出范围的常量时,GCC会生成无效指令:

static inline void atomic_add(volatile unsigned long *m, unsigned long v) 
{
    asm volatile ("lock addq %1, %0" : "+m"(*m) : "ri"(v));
}

测试代码:

extern unsigned long  x;

unsigned long m(volatile unsigned long *v)
{
    atomic_add(v, 12ul);
    atomic_add(v, 12345ul);
    atomic_add(v, 123456789000ul);
    atomic_add(v, x);
    return *v;
}

尝试过的方案:

  • 用"n"替代"i"约束,效果和"i"一致,无法解决超出范围常量的问题
  • 移除"i"约束仅保留"r",虽能兼容所有情况,但会不必要地将绝大多数在8或32位范围内的常量移入寄存器,不符合性能需求

*注:已知add指令不支持64位立即数,无需对此展开说明。

内容的提问来源于stack exchange,提问作者prl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:22:11