user: What is the c source code of the assembly code below:

```asm
<arch_select_free_register>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  movl   $0x1,-0x4(%rbp)
  movl   $0x25,-0x8(%rbp)
  jmp    L109
L112:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
L109:
  cmpl   $0x1,-0x4(%rbp)
  jne    L68
  cmpl   $0x2c,-0x8(%rbp)
  jle    L112
L68:
  movl   $0x1d,-0x8(%rbp)
  jmp    L166
L35:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
L166:
  cmpl   $0x1,-0x4(%rbp)
  jne    L16
  cmpl   $0x24,-0x8(%rbp)
  jle    L35
L16:
  movl   $0x1a,-0x8(%rbp)
  jmp    L9
L194:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  subl   $0x1,-0x8(%rbp)
L9:
  cmpl   $0x1,-0x4(%rbp)
  jne    L203
  cmpl   $0x12,-0x8(%rbp)
  jg     L194
L203:
  movl   $0xb,-0x8(%rbp)
  jmp    L218
L151:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
L218:
  cmpl   $0x1,-0x4(%rbp)
  jne    L80
  cmpl   $0x12,-0x8(%rbp)
  jle    L151
L80:
  movl   $0x3,-0x8(%rbp)
  jmp    L146
L67:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
L146:
  cmpl   $0x1,-0x4(%rbp)
  jne    L145
  cmpl   $0xa,-0x8(%rbp)
  jle    L67
L145:
  movl   $0x3,-0x8(%rbp)
  jmp    L38
L139:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
L38:
  cmpl   $0x1,-0x4(%rbp)
  jne    L231
  cmpl   $0x6,-0x8(%rbp)
  jle    L139
L231:
  movl   $0x1c,-0x8(%rbp)
  jmp    L198
L236:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
L198:
  cmpl   $0x1,-0x4(%rbp)
  jne    L55
  cmpl   $0x1c,-0x8(%rbp)
  jle    L236
L55:
  movl   $0x1b,-0x8(%rbp)
  jmp    L268
L41:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
L268:
  cmpl   $0x1,-0x4(%rbp)
  jne    L212
  cmpl   $0x1b,-0x8(%rbp)
  jle    L41
L212:
  movl   $0x2,-0x8(%rbp)
  jmp    L226
L63:
  mov    -0x24(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <do_select_reg@plt>
  mov    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
L226:
  cmpl   $0x1,-0x4(%rbp)
  jne    L263
  cmpl   $0x2,-0x8(%rbp)
  jle    L63
L263:
  mov    -0x4(%rbp),%eax
  leave
  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;
}
```