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
相关产品推荐
相关产品推荐

