首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC C汇编语言

GCC C汇编语言
EN

Stack Overflow用户
提问于 2012-12-03 19:04:16
回答 1查看 151关注 0票数 0

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

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

但是在解释这段代码时发生了意想不到的变化。有一个条件块处理中间代码中的条件跳转。我没有修改那段代码。

使用Dissy进行反汇编。

较早版本的assember如下所示:

代码语言:javascript
复制
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

较新版本:

代码语言:javascript
复制
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编写的代码:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-03 19:15:38

在这里,分支预测存在并且不能有任何差异。

相反,看起来您已经修改了原始源代码:

代码语言:javascript
复制
 void my_func( int *myarray, int N) {
      do_something(myarray[N]);
 }

代码语言:javascript
复制
 void modified( int * myarray, int N) {
     do_something(myarray);
     do_something_else(myarray[N]);
 }

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13681931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档