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

```asm
<arch_select_free_register>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  mov    %edx,%r12d
  mov    $0x25,%r13d
L32:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L13
  cmp    $0x2c,%r13d
  jle    L32
L13:
  cmp    $0x1,%eax
  jne    L146
  mov    $0x1d,%r13d
L6:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L169
  cmp    $0x24,%r13d
  jle    L6
L169:
  cmp    $0x1,%eax
  jne    L146
  mov    $0x1a,%r13d
L153:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  sub    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L44
  cmp    $0x12,%r13d
  jg     L153
L44:
  cmp    $0x1,%eax
  jne    L146
  mov    $0xb,%r13d
L160:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L30
  cmp    $0x12,%r13d
  jle    L160
L30:
  cmp    $0x1,%eax
  jne    L146
  mov    $0x3,%r13d
L0:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L10
  cmp    $0xa,%r13d
  jle    L0
L10:
  cmp    $0x1,%eax
  jne    L146
  mov    $0x3,%r13d
L118:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L194
  cmp    $0x6,%r13d
  jle    L118
L194:
  cmp    $0x1,%eax
  jne    L146
  mov    %r12d,%ecx
  mov    $0x1c,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  cmp    $0x1,%eax
  jne    L146
  mov    %r12d,%ecx
  mov    $0x1b,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  cmp    $0x1,%eax
  jne    L146
  mov    %r12d,%ecx
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
L146:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

assistant: ```c
int arch_select_free_register(struct compile_state *state, char *used, int classes) {
  int i, reg;
  reg = 1;
  for (i = 37; (reg == 1) && (i <= 44); i++) {
    reg = do_select_reg(state, used, i, classes);
  }
  for (i = 29; (reg == 1) && (i <= 36); i++) {
    reg = do_select_reg(state, used, i, classes);
  }
  for (i = 26; (reg == 1) && (i >= 19); i--) {
    reg = do_select_reg(state, used, i, classes);
  }
  for (i = 11; (reg == 1) && (i <= 18); i++) {
    reg = do_select_reg(state, used, i, classes);
  }
  for (i = 3; (reg == 1) && (i <= 10); i++) {
    reg = do_select_reg(state, used, i, classes);
  }
  for (i = 3; (reg == 1) && (i <= 6); i++) {
    reg = do_select_reg(state, used, i, classes);
  }
  for (i = 28; (reg == 1) && (i <= 28); i++) {
    reg = do_select_reg(state, used, i, classes);
  }
  for (i = 27; (reg == 1) && (i <= 27); i++) {
    reg = do_select_reg(state, used, i, classes);
  }
  for (i = 2; (reg == 1) && (i <= 2); i++) {
    reg = do_select_reg(state, used, i, classes);
  }
  return reg;
}
```