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

我试图找出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抓住了这个.

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...