user: Translate the below assembly code into C programming language:

```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
L75:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L179
  cmp    $0x2c,%r13d
  jle    L75
L179:
  cmp    $0x1,%eax
  jne    L131
  mov    $0x1d,%r13d
L104:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L57
  cmp    $0x24,%r13d
  jle    L104
L57:
  cmp    $0x1,%eax
  jne    L131
  mov    $0x1a,%r13d
L160:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  sub    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L145
  cmp    $0x12,%r13d
  jg     L160
L145:
  cmp    $0x1,%eax
  jne    L131
  mov    $0xb,%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    L62
  cmp    $0x12,%r13d
  jle    L0
L62:
  cmp    $0x1,%eax
  jne    L131
  mov    $0x3,%r13d
L92:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L17
  cmp    $0xa,%r13d
  jle    L92
L17:
  cmp    $0x1,%eax
  jne    L131
  mov    $0x3,%r13d
L16:
  mov    %r12d,%ecx
  mov    %r13d,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%r13d
  cmp    $0x1,%eax
  jne    L95
  cmp    $0x6,%r13d
  jle    L16
L95:
  cmp    $0x1,%eax
  jne    L131
  mov    %r12d,%ecx
  mov    $0x1c,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  cmp    $0x1,%eax
  jne    L131
  mov    %r12d,%ecx
  mov    $0x1b,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
  cmp    $0x1,%eax
  jne    L131
  mov    %r12d,%ecx
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <do_select_reg@plt>
L131:
  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;
}
```