user: 下面的汇编指令对应的C源代码是什么：

```asm
<sq905c_first_decompress>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x60,%rsp
  movdqa D14(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  movabs $0x200000000,%rax
  movaps %xmm0,0x30(%rsp)
  movdqa D19(%rip),%xmm0
  movaps %xmm0,0x40(%rsp)
  mov    %rax,0x4(%rsp)
  movabs $0xe00000006,%rax
  mov    %rax,0xc(%rsp)
  add    $0x8,%rax
  mov    %rax,0x14(%rsp)
  movabs $0xfb0000000e,%rax
  mov    %rax,0x1c(%rsp)
  xor    %eax,%eax
  mov    %ax,0x2e(%rsp)
  test   %edx,%edx
  je     L42
  lea    -0x1(%rdx),%eax
  mov    %rsi,%r11
  mov    $0x8,%r8d
  xor    %r9d,%r9d
  lea    0x1(%rdi,%rax,1),%r13
  xor    %ecx,%ecx
  lea    0x30(%rsp),%r10
  lea    0x2e(%rsp),%r12
  lea    0x8(%rsp),%rbp
L33:
  mov    %r12,%rbx
L80:
  mov    %rbp,%rsi
  xor    %r14d,%r14d
  xor    %eax,%eax
  jmp    L61
  nop
L59:
  add    $0x1,%r8d
L26:
  mov    %ecx,%edx
  add    %eax,%eax
  add    %ecx,%ecx
  shr    $0x7,%dl
  or     %eax,%edx
  movzbl %dl,%eax
  cmp    %r14d,%eax
  jle    L55
  mov    (%rsi),%r14d
  add    $0x4,%rsi
L61:
  cmp    $0x8,%r8d
  jne    L59
  mov    %r9d,%edx
  mov    $0x1,%r8d
  add    $0x1,%r9d
  movzbl (%r11,%rdx,1),%ecx
  jmp    L26
  nopl   0x0(%rax,%rax,1)
L55:
  mov    $0x1,%eax
  mov    $0x2,%esi
  test   %dl,%dl
  jne    L0
  jmp    L10
L56:
  movzbl (%rax,%r10,1),%esi
L0:
  mov    %eax,%r14d
  add    $0x1,%rax
  cmp    %dl,%sil
  jne    L56
  movzbl 0x40(%rsp,%r14,1),%eax
L43:
  mov    %al,(%rbx)
  add    $0x1,%rbx
  cmp    %r10,%rbx
  jne    L80
  movzbl 0x2e(%rsp),%eax
  add    $0x1,%rdi
  shl    $0x4,%eax
  or     0x2f(%rsp),%al
  mov    %al,-0x1(%rdi)
  cmp    %r13,%rdi
  jne    L33
L42:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L97
  add    $0x60,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L10:
  mov    $0x8,%eax
  jmp    L43
L97:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: data_label: D14
data_type: byte[16]
name: read_data
arguments: data_label: D19
data_type: byte[16]

tool: {"D14": [0x00,0x02,0x06,0x0e,0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb]}

tool: {"D19": [0x08,0x07,0x09,0x06,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x05,0x04,0x03,0x02,0x01,0x00]}

assistant: ```c
int sq905c_first_decompress(unsigned char *output, const unsigned char *input, unsigned int outputsize) {
  unsigned char parity = 0;
  unsigned char nibble_to_keep[2];
  unsigned char temp1 = 0, temp2 = 0;
  unsigned char input_byte;
  unsigned char lookup = 0;
  unsigned int i = 0;
  unsigned int bytes_used = 0;
  unsigned int bytes_done = 0;
  unsigned int bit_counter = 8;
  unsigned int cycles = 0;
  int table[9] = {-1, 0, 2, 6, 0x0e, 0x0e, 0x0e, 0x0e, 0xfb};
  unsigned char lookup_table[16] = {0, 2, 6, 0x0e, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb};
  unsigned char translator[16] = {8, 7, 9, 6, 10, 11, 12, 13, 14, 15, 5, 4, 3, 2, 1, 0};
  nibble_to_keep[0] = 0;
  nibble_to_keep[1] = 0;
  while (bytes_done < outputsize) {
    while (parity < 2) {
      while (lookup > table[cycles]) {
        if (bit_counter == 8) {
          input_byte = input[bytes_used];
          bytes_used++;
          temp1 = input_byte;
          bit_counter = 0;
        }
        input_byte = temp1;
        temp2 = (temp2 << 1) & 0xFF;
        input_byte = input_byte >> 7;
        temp2 = temp2 | input_byte;
        temp1 = (temp1 << 1) & 0xFF;
        bit_counter++;
        cycles++;
        if (cycles > 9)
          return -1;
        lookup = temp2 & 0xff;
      }
      temp2 = 0;
      for (i = 0; i < 17; i++) {
        if (lookup == lookup_table[i]) {
          nibble_to_keep[parity] = translator[i];
          break;
        }
        if (i == 16)
          return -1;
      }
      cycles = 0;
      parity++;
    }
    output[bytes_done] = (nibble_to_keep[0] << 4) | nibble_to_keep[1];
    bytes_done++;
    parity = 0;
  }
  return 0;
}
```