我试图找出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正在检查值!= 1.5并跳过赋值,但jp在这种情况下做了什么?
解决方法
如果不相等则jne跳跃,即如果未设置零标志则跳转.如果奇偶校验,jp是跳跃.
ucomisd被定义为比较两个双打.它表明它们是四个方面之一:无序,相等,大于或小于.
如果数字是无序的或相等的,则设置零标志.因此,jne避免了大于或小于的剩余情况.
仅在结果无序时才设置奇偶校验. jp抓住了这个.
所以两者一起避免:无序,大于,小于.只剩下第四种可能性.