use*_*359 6 c assembly x86-64 llvm instructions
我试图找出LLVM生成的C代码中的目的jp/ jnp指令.样品:
int main(int argc, const char * argv[]) {
double value = 1.5;
if (value == 1.5) {
value = 3.0;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
装配输出:
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
Run Code Online (Sandbox Code Playgroud)
将jne被检查是否value != 1.5和跳跃过分配,但什么是jp在这种情况下做什么?
Tom*_*mmy 13
jne是jump if not equal,即如果未设置零标志则跳转.jp是jump if parity.
ucomisd被定义为比较两个doubles.它表明它们是四个方面之一:无序,相等,大于或小于.
如果数字是无序的或相等的,则设置零标志.因此jne避免了大于或小于的剩余案例.
仅在结果无序时才设置奇偶校验.的jp渔获量这一点.
所以两者一起避免:无序,大于,小于.只剩下第四种可能性.