user: Converte this assembly snippet into its equivalent C code:

```asm
<CreateCounts>:
  endbr64
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  sub    $0x8,%rsp
  cmp    $0x20,%esi
  je     L25
  mov    %esi,%r12d
  cmp    $0x8,%esi
  ja     L4
  lea    D63(%rip),%rsi
  xor    %eax,%eax
  call   <Output@plt>
  lea    D68(%rip),%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <Output@plt>
  lea    D2(%rip),%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <Output@plt>
  lea    D97(%rip),%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <Output@plt>
  lea    D61(%rip),%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <Output@plt>
L14:
  mov    %rbp,%rdi
  lea    D9(%rip),%rsi
  xor    %eax,%eax
  call   <Output@plt>
  mov    $0x20,%eax
  xor    %edx,%edx
  mov    %rbp,%rdi
  div    %r12d
  lea    D60(%rip),%rsi
  mov    %eax,%edx
  mov    %eax,%r12d
  xor    %eax,%eax
  call   <Output@plt>
  mov    %rbp,%rdi
  lea    D47(%rip),%rsi
  xor    %eax,%eax
  call   <Output@plt>
  add    $0x8,%rsp
  mov    %r12d,%edx
  mov    %rbp,%rdi
  lea    D100(%rip),%rsi
  pop    %rbp
  xor    %eax,%eax
  pop    %r12
  jmp    1050 <Output@plt>
  nopw   0x0(%rax,%rax,1)
L4:
  lea    D109(%rip),%rsi
  xor    %eax,%eax
  call   <Output@plt>
  jmp    L14
  nopl   0x0(%rax,%rax,1)
L25:
  add    $0x8,%rsp
  lea    D86(%rip),%rsi
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  jmp    1050 <Output@plt>
```

tool_calls: name: disassemble_data
arguments: label: D63
data_type: string
name: disassemble_data
arguments: label: D68
data_type: string
name: disassemble_data
arguments: label: D2
data_type: string
name: disassemble_data
arguments: label: D97
data_type: string
name: disassemble_data
arguments: label: D61
data_type: string
name: disassemble_data
arguments: label: D9
data_type: string
name: disassemble_data
arguments: label: D60
data_type: string
name: disassemble_data
arguments: label: D47
data_type: string
name: disassemble_data
arguments: label: D100
data_type: string
name: disassemble_data
arguments: label: D109
data_type: string
name: disassemble_data
arguments: label: D86
data_type: string

tool: D63: LeftCount = (ULONG_PTR) DestBase & 0x03;


tool: D68: if ((ULONG)(BltInfo->DestRect.right - BltInfo->DestRect.left) < LeftCount)


tool: D2: {


tool: D97: LeftCount = BltInfo->DestRect.right - BltInfo->DestRect.left;


tool: D61: }


tool: D9: CenterCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -


tool: D60:                LeftCount) / %u;


tool: D47: RightCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -


tool: D100:               LeftCount - %u * CenterCount);


tool: D109: LeftCount = ((ULONG_PTR) DestBase >> 1) & 0x01;


tool: D86: CenterCount = BltInfo->DestRect.right - BltInfo->DestRect.left;


assistant: ```c
void CreateCounts(FILE *Out, unsigned Bpp) {
  ;
  if (32 != Bpp) {
    if (8 < Bpp) {
      Output(Out, "LeftCount = ((ULONG_PTR) DestBase >> 1) & 0x01;\n");
    } else {
      Output(Out, "LeftCount = (ULONG_PTR) DestBase & 0x03;\n");
      Output(Out, "if ((ULONG)(BltInfo->DestRect.right - BltInfo->DestRect.left) < "
                  "LeftCount)\n");
      Output(Out, "{\n");
      Output(Out, "LeftCount = BltInfo->DestRect.right - "
                  "BltInfo->DestRect.left;\n");
      Output(Out, "}\n");
    }
    Output(Out, "CenterCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
    Output(Out, "               LeftCount) / %u;\n", 32 / Bpp);
    Output(Out, "RightCount = (BltInfo->DestRect.right - BltInfo->DestRect.left -\n");
    Output(Out, "              LeftCount - %u * CenterCount);\n", 32 / Bpp);
  } else {
    Output(Out, "CenterCount = BltInfo->DestRect.right - BltInfo->DestRect.left;\n");
  }
}
```