title: Useless jp / jnp assembly instruction on x86_64
body: <p>I'm trying to figure out what purpose <code>jp</code>/<code>jnp</code> instructions serve in LLVM-generated C code. Sample:</p>
  
  <pre><code>int main(int argc, const char * argv[]) {
      double value = 1.5;
  
      if (value == 1.5) {
          value = 3.0;
      }
  
      return 0;
  }
  </code></pre>
  
  <p>Assembly output:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>The <code>jne</code> is checking if <code>value != 1.5</code> and jumping over the assignment, but what is the <code>jp</code> doing in this context?</p>