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

```asm
<arch_select_free_register>:
  endbr64
  push   %r13
  mov    %edx,%r13d
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    $0x25,%ebx
  sub    $0x8,%rsp
  nopl   0x0(%rax)
L73:
  mov    %ebx,%edx
  mov    %r13d,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%ebx
  cmp    $0x1,%eax
  jne    L119
  cmp    $0x2c,%ebx
  jle    L73
  cmp    $0x1,%eax
  jne    L119
  mov    $0x1d,%ebx
  nop
L123:
  mov    %ebx,%edx
  mov    %r13d,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%ebx
  cmp    $0x1,%eax
  jne    L119
  cmp    $0x24,%ebx
  jle    L123
  cmp    $0x1,%eax
  jne    L119
  mov    $0x1a,%ebx
  nop
L120:
  mov    %ebx,%edx
  mov    %r13d,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <do_select_reg@plt>
  sub    $0x1,%ebx
  cmp    $0x1,%eax
  jne    L119
  cmp    $0x12,%ebx
  jg     L120
  cmp    $0x1,%eax
  jne    L119
  mov    $0xb,%ebx
  nop
L38:
  mov    %ebx,%edx
  mov    %r13d,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%ebx
  cmp    $0x1,%eax
  jne    L119
  cmp    $0x12,%ebx
  jle    L38
  cmp    $0x1,%eax
  jne    L119
  mov    $0x3,%ebx
  nop
L70:
  mov    %ebx,%edx
  mov    %r13d,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%ebx
  cmp    $0x1,%eax
  jne    L119
  cmp    $0xa,%ebx
  jle    L70
  cmp    $0x1,%eax
  jne    L119
  mov    $0x3,%ebx
L199:
  mov    %ebx,%edx
  mov    %r13d,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <do_select_reg@plt>
  add    $0x1,%ebx
  cmp    $0x1,%eax
  jne    L119
  cmp    $0x6,%ebx
  jle    L199
  cmp    $0x1,%eax
  jne    L119
  mov    %r13d,%ecx
  mov    $0x1c,%edx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <do_select_reg@plt>
  cmp    $0x1,%eax
  jne    L119
  mov    %r13d,%ecx
  mov    $0x1b,%edx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <do_select_reg@plt>
  cmp    $0x1,%eax
  jne    L119
  add    $0x8,%rsp
  mov    %r13d,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  pop    %rbx
  mov    $0x2,%edx
  pop    %rbp
  pop    %r12
  pop    %r13
  jmp    1050 <do_select_reg@plt>
L119:
  pop    %rdx
  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;
}
```