【发布时间】:2015-03-26 19:07:06
【问题描述】:
我试图弄清楚 jp/jnp 指令在 LLVM 生成的 C 代码中的用途。示例:
int main(int argc, const char * argv[]) {
double value = 1.5;
if (value == 1.5) {
value = 3.0;
}
return 0;
}
汇编输出:
Ltmp4:
movsd LCPI0_0(%rip), %xmm0
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
Ltmp5:
movsd %xmm0, -24(%rbp)
Ltmp6:
movsd -24(%rbp), %xmm1
ucomisd %xmm0, %xmm1
jne LBB0_2
jp LBB0_2
## BB#1:
movabsq $3, %rax
cvtsi2sdq %rax, %xmm0
Ltmp7:
movsd %xmm0, -24(%rbp)
Ltmp8:
LBB0_2:
movl $0, %eax
popq %rbp
retq
jne 正在检查 value != 1.5 是否并跳过分配,但 jp 在这种情况下在做什么?
【问题讨论】:
-
我想你告诉 llvm 不要制作优化代码之类的。编译器不可能发出
mov $0, %eax而不是xor %eax, %eax任何级别的优化。该代码中还有其他令人讨厌的东西:movabsq $3, %rax是 10 个字节,与movl $3, %eax相比,但效果完全相同。
标签: c assembly llvm x86-64 instructions