GCC C汇编程序

时间:2012-12-03 11:04:16

标签: c gcc disassembly

我正在构建解释,用C语言编写并使用GCC。

我改变了生成中间代码的方式。

但在解释此代码时发生了意外的变化。 有一个条件块处理中间代码中的条件跳转。 我没有更改那段代码。

使用Dissy进行反汇编。

旧版本的声明如下:

mov  0x10(%r14),%rax
mov  0x50(%rsp),%rcx
mov  (%rcx,%rax,8),%r12
mov  (%r12),%eax
test $0x4,%al
je   4077ef
cmpb $0x0,0x8(%r12)
je   4077ef

较新版本:

mov  0x10(%r14),%rax
mov  (%r12,%rax,8),%rdx
mov  (%rdx),%eax
test $0x4,%al
je   4073e0
cmpb $0x0,0x8(%rdx)
je   4073e0

此更改导致错误预测导致4-6%的性能下降。

有没有办法建议GCC使用旧版本而不使用汇编部分,以保持可移植性?

感谢。

修改

C代码:

if((M->type & 4 && M->val.boolean)
|| (M->type & 1 && M->val.number != 0.0)
|| (M->type & 2 && M->val.string.length != 0))
    // true;
else
    // false;

1 个答案:

答案 0 :(得分:2)

这里的分支预测存在并且可能没有任何区别。

相反,您似乎修改了原始源代码:

 void my_func( int *myarray, int N) {
      do_something(myarray[N]);
 }

 void modified( int * myarray, int N) {
     do_something(myarray);
     do_something_else(myarray[N]);
 }

因为在后一种情况下,myarray的基础已经缓存在寄存器r12中 - 或者您刚刚将myarray从本地堆栈中移除以用作函数的参数。