小编use*_*875的帖子

gcc内联汇编 - 操作数类型不匹配"add",试图创建无分支代码

我正在尝试做一些代码优化来消除分支,原始的c代码是

if( a < b ) 
   k = (k<<1) + 1;
else
   k = (k<<1)
Run Code Online (Sandbox Code Playgroud)

我打算用下面的汇编代码替换它

mov a, %rax 
mov b, %rbx
mov k, %rcx
xor %rdx %rdx
shl 1, %rcx
cmp %rax, %rax
setb %rdx
add %rdx,%rcx
mov %rcx, k 
Run Code Online (Sandbox Code Playgroud)

所以我写了内联汇编代码,如打击,

#define next(a, b, k)\
 __asm__("shl $0x1, %0; \
         xor %%rbx, %%rbx; \
         cmp %1, %2; \
         setb %%rbx; \
         addl  %%rbx,%0;":"+c"(k) :"g"(a),"g"(b))
Run Code Online (Sandbox Code Playgroud)

当我编译下面的代码时,我得到了错误:

operand type mismatch for `add'
operand type mismatch for `setb'
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

c performance x86 assembly inline-assembly

5
推荐指数
3
解决办法
2万
查看次数

标签 统计

assembly ×1

c ×1

inline-assembly ×1

performance ×1

x86 ×1