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

```asm
<tgCompare>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <tg_mini_size@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x50(%rbp),%rax
  mov    %rax,%rdi
  call   <tg_mini_size@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0x30(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jbe    L39
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  jmp    L27
L39:
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x38(%rbp)
L27:
  mov    -0x38(%rbp),%rax
  test   %rax,%rax
  js     L78
  pxor   %xmm0,%xmm0
  cvtsi2ss %rax,%xmm0
  jmp    L47
L78:
  mov    %rax,%rdx
  shr    %rdx
  and    $0x1,%eax
  or     %rax,%rdx
  pxor   %xmm0,%xmm0
  cvtsi2ss %rdx,%xmm0
  addss  %xmm0,%xmm0
L47:
  mov    -0x30(%rbp),%rax
  test   %rax,%rax
  js     L72
  pxor   %xmm1,%xmm1
  cvtsi2ss %rax,%xmm1
  jmp    L25
L72:
  mov    %rax,%rdx
  shr    %rdx
  and    $0x1,%eax
  or     %rax,%rdx
  pxor   %xmm1,%xmm1
  cvtsi2ss %rdx,%xmm1
  addss  %xmm1,%xmm1
L25:
  divss  %xmm1,%xmm0
  movd   %xmm0,%ecx
  mov    -0x58(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  movd   %ecx,%xmm0
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <tg_big_create@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x38(%rbp),%rax
  test   %rax,%rax
  js     L88
  pxor   %xmm0,%xmm0
  cvtsi2ss %rax,%xmm0
  jmp    L136
L88:
  mov    %rax,%rdx
  shr    %rdx
  and    $0x1,%eax
  or     %rax,%rdx
  pxor   %xmm0,%xmm0
  cvtsi2ss %rdx,%xmm0
  addss  %xmm0,%xmm0
L136:
  mov    -0x28(%rbp),%rax
  test   %rax,%rax
  js     L68
  pxor   %xmm1,%xmm1
  cvtsi2ss %rax,%xmm1
  jmp    L58
L68:
  mov    %rax,%rdx
  shr    %rdx
  and    $0x1,%eax
  or     %rax,%rdx
  pxor   %xmm1,%xmm1
  cvtsi2ss %rdx,%xmm1
  addss  %xmm1,%xmm1
L58:
  divss  %xmm1,%xmm0
  movd   %xmm0,%ecx
  mov    -0x58(%rbp),%rdx
  mov    -0x50(%rbp),%rax
  movd   %ecx,%xmm0
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <tg_big_create@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <tg_big_score@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <tg_big_score@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x10(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jbe    L96
  mov    -0x10(%rbp),%rax
  neg    %eax
  mov    %eax,-0x3c(%rbp)
  jmp    L10
L96:
  mov    -0x10(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jae    L36
  mov    -0x8(%rbp),%rax
  mov    %eax,-0x3c(%rbp)
  jmp    L10
L36:
  movl   $0x0,-0x3c(%rbp)
L10:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <tg_big_destroy@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <tg_big_destroy@plt>
  mov    -0x3c(%rbp),%eax
  leave
  ret
```

assistant: ```c
int tgCompare(const unsigned char *a, const unsigned char *b, const unsigned char *t) {
  unsigned long asz, bsz, max;
  unsigned short *abt, *bbt;
  unsigned long ascore, dirore;
  int r;
  asz = tg_mini_size(a);
  bsz = tg_mini_size(b);
  if (asz > bsz)
    max = asz;
  else
    max = bsz;
  abt = tg_big_create(a, t, (1.0f * max) / (1.0f * asz));
  bbt = tg_big_create(b, t, (1.0f * max) / (1.0f * bsz));
  ascore = tg_big_score(abt);
  dirore = tg_big_score(bbt);
  if (ascore > dirore)
    r = -1 * ascore;
  else if (ascore < dirore)
    r = dirore;
  else
    r = 0;
  tg_big_destroy(abt);
  tg_big_destroy(bbt);
  return r;
}
```