user: 请从给定的汇编指令推导出C源代码：

```asm
<rx02_bitpair>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %edi,-0x4(%rbp)
  movsd  %xmm0,-0x10(%rbp)
  cmpl   $0xffffffff,-0x4(%rbp)
  jne    L29
  movl   $0x0,D20(%rip)
  movl   $0x0,D115(%rip)
  jmp    L49
L29:
  cmpl   $0xfffffffe,-0x4(%rbp)
  jne    L60
  jmp    L87
L71:
  mov    D115(%rip),%eax
  sub    $0x1,%eax
  mov    %eax,D24(%rip)
  mov    D24(%rip),%eax
  mov    $0x3,%edx
  mov    %eax,%ecx
  shl    %cl,%edx
  mov    D20(%rip),%eax
  and    %edx,%eax
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    -0x10(%rbp),%rdx
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <cw_bit@plt>
  mov    D20(%rip),%edx
  mov    D24(%rip),%eax
  mov    %eax,%ecx
  sar    %cl,%edx
  mov    %edx,%eax
  and    $0x1,%eax
  test   %eax,%eax
  setne  %al
  movzbl %al,%eax
  mov    -0x10(%rbp),%rdx
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <cw_bit@plt>
L87:
  mov    D24(%rip),%eax
  test   %eax,%eax
  jne    L71
  jmp    L49
L60:
  mov    D20(%rip),%eax
  add    %eax,%eax
  or     -0x4(%rbp),%eax
  mov    %eax,D24(%rip)
  mov    D24(%rip),%eax
  add    $0x1,%eax
  mov    %eax,D24(%rip)
  mov    D24(%rip),%eax
  cmp    $0x5,%eax
  jne    L49
  mov    D24(%rip),%eax
  and    $0x3f,%eax
  cmp    $0x1e,%eax
  jne    L13
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x1,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x0,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x0,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x0,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x1,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x0,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x0,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x0,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x1,%edi
  call   <cw_bit@plt>
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x0,%edi
  call   <cw_bit@plt>
  movl   $0x0,D24(%rip)
  jmp    L49
L13:
  mov    D24(%rip),%eax
  and    $0x30,%eax
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    -0x10(%rbp),%rdx
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <cw_bit@plt>
  mov    D24(%rip),%eax
  and    $0x10,%eax
  test   %eax,%eax
  setne  %al
  movzbl %al,%eax
  mov    -0x10(%rbp),%rdx
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <cw_bit@plt>
  mov    D24(%rip),%eax
  sub    $0x1,%eax
  mov    %eax,D24(%rip)
L49:
  nop
  leave
  ret
```

assistant: ```c
void rx02_bitpair(int bit, double mult) {
  static int accum = 0;
  static int bitcount = 0;
  if (bit == -1) {
    accum = 0;
    bitcount = 0;
  } else if (bit == -2) {
    while (bitcount) {
      bitcount--;
      cw_bit((accum & (3 << bitcount)) == 0, mult);
      cw_bit((accum & (1 << bitcount)) != 0, mult);
    }
  } else {
    accum = (accum << 1) | bit;
    bitcount++;
    if (bitcount == 5) {
      if ((accum & 0x3f) == 0x1e) {
        cw_bit(1, mult);
        cw_bit(0, mult);
        cw_bit(0, mult);
        cw_bit(0, mult);
        cw_bit(1, mult);
        cw_bit(0, mult);
        cw_bit(0, mult);
        cw_bit(0, mult);
        cw_bit(1, mult);
        cw_bit(0, mult);
        bitcount = 0;
      } else {
        cw_bit((accum & (3 << 4)) == 0, mult);
        cw_bit((accum & (1 << 4)) != 0, mult);
        bitcount--;
      }
    }
  }
}
```