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

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

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

ucomisd被定义为比较两个doubles.它表明它们是四个方面之一:无序,相等,大于或小于.

如果数字是无序的或相等的,则设置零标志.因此jne避免了大于或小于的剩余案例.

仅在结果无序时才设置奇偶校验.的jp渔获量这一点.

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

  • 关于术语的说明:"无序"表示两个参数没有相关的顺序; 也就是说,其中至少有一个是NaN.如果它们是非NaN并且相等,则不相同是"无序的". (2认同)
  • @Tommy干杯,你作为同事和科学家的尊重,因为科学家只寻求真正的知识,而政治家只想隐藏错误. (2认同)