我为我的Java程序进行JIT编译时得到了下面的汇编列表结果。
mov 0x14(%rsp),%r10d
inc %r10d
mov 0x1c(%rsp),%r8d
inc %r8d
test %eax,(%r11) ; <--- this instruction
mov (%rsp),%r9
mov 0x40(%rsp),%r14d
mov 0x18(%rsp),%r11d
mov %ebp,%r13d
mov 0x8(%rsp),%rbx
mov 0x20(%rsp),%rbp
mov 0x10(%rsp),%ecx
mov 0x28(%rsp),%rax
movzbl 0x18(%r9),%edi
movslq %r8d,%rsi
cmp 0x30(%rsp),%rsi
jge 0x00007fd3d27c4f17
我理解这里test
指令是无用的,因为测试的主要思想是
SF、ZF、PF标志位被修改,而AND的结果被丢弃。
在这里我们不使用这些结果标志位。
这是JIT中的一个错误吗?还是我忽略了什么?如果是错误,请问报告错误的最佳位置在哪里?谢谢!
mov (%r11), %r9d
,因为另一条指令即将写入r9
。 MOV 的代码字节数相同,但它是一个纯载入指令,没有 ALU 微操作。这是一个次要的优化,因为 ALU 端口压力几乎肯定不是问题,而现代的 x86 CPU 将负载微融合到单个微操作中,并通过大部分流水线与 ALU 指令一起运行,因此它不会影响前端吞吐量。 - Peter Cordes