gpt4 book ai didi

c - x86_64 上无用的 jp/jnp 汇编指令

转载 作者:太空狗 更新时间:2023-10-29 17:17:52 28 4
gpt4 key购买 nike

我试图找出 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 在这个上下文中做什么?

最佳答案

jnejump if not equal,即如果没有设置零标志则跳转。 jpjump if parity.

ucomisd 被定义为比较两个 doubles。它将表明它们是以下四种情况之一:无序、相等、大于或小于。

如果数字无序或相等,则设置零标志。所以 jne 避免了剩余的大于或小于的情况。

仅当结果无序时才会设置奇偶校验。 jp 捕捉到这一点。

所以两者一起避免:无序,大于,小于。只剩下第四种可能,equal。

关于c - x86_64 上无用的 jp/jnp 汇编指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28182827/

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