我正在构建解释,用 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;