user: Please show me the C implementation that matches the assembly code listed below:

```asm
<PrintIfNeeded>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %ecx,%ebp
  push   %rbx
  sub    $0x38,%rsp
  mov    0x70(%rsp),%eax
  mov    %edx,0x10(%rsp)
  mov    0x78(%rsp),%edx
  mov    %edi,0x8(%rsp)
  mov    %r8d,%edi
  mov    %eax,0x14(%rsp)
  mov    0x88(%rsp),%eax
  mov    %esi,0xc(%rsp)
  mov    %ecx,%esi
  mov    0x80(%rsp),%ebx
  mov    %eax,0x18(%rsp)
  mov    0x90(%rsp),%eax
  mov    %r9d,0x24(%rsp)
  mov    0xb0(%rsp),%r14d
  mov    %eax,0x28(%rsp)
  mov    0x98(%rsp),%eax
  mov    %r8d,0x4(%rsp)
  mov    0xb8(%rsp),%r12d
  mov    %eax,0x1c(%rsp)
  mov    0xa0(%rsp),%eax
  mov    0xc0(%rsp),%r15d
  mov    0xc8(%rsp),%r13d
  mov    %eax,0x20(%rsp)
  mov    0xa8(%rsp),%eax
  mov    %eax,0x2c(%rsp)
  call   <mpz_mod@plt>
  mov    0x4(%rsp),%edi
  xor    %esi,%esi
  call   <mpz_cmp_ui@plt>
  mov    0x8(%rsp),%r11d
  test   %r11d,%r11d
  je     L2
  test   %eax,%eax
  je     L2
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  cs nopw 0x0(%rax,%rax,1)
L2:
  mov    0x24(%rsp),%edx
  mov    0x14(%rsp),%edi
  mov    %ebp,%esi
  call   <mpz_sub@plt>
  mov    0xc(%rsp),%esi
  mov    %r14d,%edi
  call   <mpf_set_z@plt>
  mov    0x10(%rsp),%esi
  mov    %r12d,%edi
  call   <mpf_set_z@plt>
  mov    %ebp,%esi
  mov    %r15d,%edi
  call   <mpf_set_z@plt>
  mov    0x14(%rsp),%esi
  mov    %r13d,%edi
  call   <mpf_set_z@plt>
  mov    %r15d,%edx
  mov    %r14d,%esi
  mov    %ebx,%edi
  call   <mpf_div@plt>
  mov    %r15d,%edx
  mov    0x28(%rsp),%r15d
  mov    %r12d,%esi
  mov    %r15d,%edi
  call   <mpf_div@plt>
  mov    0x1c(%rsp),%edi
  mov    %r15d,%edx
  mov    %ebx,%esi
  call   <mpf_add@plt>
  mov    0x1c(%rsp),%edx
  mov    0x18(%rsp),%edi
  mov    $0x1,%esi
  call   <mpf_ui_sub@plt>
  mov    0x20(%rsp),%edi
  mov    %r13d,%edx
  mov    %r14d,%esi
  call   <mpf_div@plt>
  mov    0x2c(%rsp),%r14d
  mov    %r13d,%edx
  mov    %r12d,%esi
  mov    %r14d,%edi
  call   <mpf_div@plt>
  mov    0x20(%rsp),%eax
  mov    0x10(%rsp),%ecx
  mov    %r15d,%r9d
  mov    0xc(%rsp),%edx
  mov    %ebx,%r8d
  mov    %ebp,%esi
  lea    D2(%rip),%rdi
  mov    %eax,0x78(%rsp)
  mov    0x18(%rsp),%eax
  mov    %r14d,0x80(%rsp)
  mov    %eax,0x70(%rsp)
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10d0 <gmp_printf@plt>
```

tool_calls: name: parse_data
arguments: data_label: D2
type_infered: string

tool: D2: Loop %Zd, WinsWithBonus %Zd, LossesWithBonus %Zd, RelativeBonusWins %Ff, RelativeBonusLosses %Ff, RelativeBonusDraws %Ff, RelativeBonusWinResults %Ff, RelativeBonusLossResults %Ff


assistant: ```c
void PrintIfNeeded(int fastmode, mpz_t WinsWithBonus, mpz_t LossesWithBonus, mpz_t LoopCounter, mpz_t LoopModuloFastmode, mpz_t DrawCounter, mpz_t NumberOfResults, mpz_t FastmodeSkip, mpf_t RelativeBonusWins, mpf_t RelativeBonusDraws, mpf_t RelativeBonusLosses, mpf_t RelativeBonusResults, mpf_t RelativeBonusWinResults, mpf_t RelativeBonusLossResults, mpf_t WinsWithBonusFloat, mpf_t LossesWithBonusFloat, mpf_t LoopCounterFloat, mpf_t NumberOfResultsFloat) {
  int LoopModuloFastmodeInt;
  mpz_mod(LoopModuloFastmode, LoopCounter, FastmodeSkip);
  LoopModuloFastmodeInt = mpz_cmp_ui(LoopModuloFastmode, 0);
  if ((fastmode == 0) || (LoopModuloFastmodeInt == 0)) {
    mpz_sub(NumberOfResults, LoopCounter, DrawCounter);
    mpf_set_z(WinsWithBonusFloat, WinsWithBonus);
    mpf_set_z(LossesWithBonusFloat, LossesWithBonus);
    mpf_set_z(LoopCounterFloat, LoopCounter);
    mpf_set_z(NumberOfResultsFloat, NumberOfResults);
    mpf_div(RelativeBonusWins, WinsWithBonusFloat, LoopCounterFloat);
    mpf_div(RelativeBonusLosses, LossesWithBonusFloat, LoopCounterFloat);
    mpf_add(RelativeBonusResults, RelativeBonusWins, RelativeBonusLosses);
    mpf_ui_sub(RelativeBonusDraws, 1, RelativeBonusResults);
    mpf_div(RelativeBonusWinResults, WinsWithBonusFloat, NumberOfResultsFloat);
    mpf_div(RelativeBonusLossResults, LossesWithBonusFloat, NumberOfResultsFloat);
    gmp_printf("Loop %Zd, "
               "WinsWithBonus %Zd, "
               "LossesWithBonus %Zd, "
               "RelativeBonusWins %Ff, "
               "RelativeBonusLosses %Ff, "
               "RelativeBonusDraws %Ff, "
               "RelativeBonusWinResults %Ff, "
               "RelativeBonusLossResults %Ff\n",
               LoopCounter, WinsWithBonus, LossesWithBonus, RelativeBonusWins, RelativeBonusLosses, RelativeBonusDraws, RelativeBonusWinResults, RelativeBonusLossResults);
  }
}
```