x86_64 上无用的 jp / jnp 汇编指令
Useless jp / jnp assembly instruction on x86_64
我试图找出 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 [=12=], -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 , %rax
cvtsi2sdq %rax, %xmm0
Ltmp7:
movsd %xmm0, -24(%rbp)
Ltmp8:
LBB0_2:
movl [=12=], %eax
popq %rbp
retq
jne
正在检查是否 value != 1.5
并跳过赋值,但是 jp
在这种情况下做什么?
jne
是jump if not equal
,即如果没有设置零标志则跳转。 jp
是 jump if parity
.
ucomisd
定义为比较两个doubles
。它将表明它们是四种事物之一:无序、相等、大于或小于。
如果数字无序或相等,则设置零标志。所以 jne
避免了其余大于或小于的情况。
仅当结果无序时才设置奇偶校验。 jp
抓住了那个。
所以两者一起避免:无序,大于,小于。只剩下第四种可能,equal
我试图找出 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 [=12=], -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 , %rax
cvtsi2sdq %rax, %xmm0
Ltmp7:
movsd %xmm0, -24(%rbp)
Ltmp8:
LBB0_2:
movl [=12=], %eax
popq %rbp
retq
jne
正在检查是否 value != 1.5
并跳过赋值,但是 jp
在这种情况下做什么?
jne
是jump if not equal
,即如果没有设置零标志则跳转。 jp
是 jump if parity
.
ucomisd
定义为比较两个doubles
。它将表明它们是四种事物之一:无序、相等、大于或小于。
如果数字无序或相等,则设置零标志。所以 jne
避免了其余大于或小于的情况。
仅当结果无序时才设置奇偶校验。 jp
抓住了那个。
所以两者一起避免:无序,大于,小于。只剩下第四种可能,equal