gpt4 book ai didi

c - GCC C 汇编程序

转载 作者:行者123 更新时间:2023-11-30 14:22:32 27 4
gpt4 key购买 nike

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

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

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

使用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;

最佳答案

这里的分支预测有任何区别,也不可能有任何区别。

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

 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 从本地堆栈移动以用作函数的参数。

关于c - GCC C 汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13681931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com