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

```asm
<fromuutobits>:
  endbr64
  movzbl (%rsi),%eax
  mov    $0x0,%r11d
  cmp    $0x60,%al
  je     L75
  movsbl %al,%eax
  lea    -0x20(%rax),%r11d
  lea    0x1(%rsi),%rdx
  cmp    $0x2d,%r11d
  ja     L212
  test   %r11d,%r11d
  je     L75
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  lea    0x2(,%r11,4),%eax
  movslq %eax,%rcx
  imul   $0x55555556,%rcx,%rcx
  shr    $0x20,%rcx
  sar    $0x1f,%eax
  sub    %eax,%ecx
  lea    -0x4(%rcx),%r8d
  lea    -0x1(%rcx),%eax
  and    $0xfffffffc,%eax
  sub    %eax,%r8d
  mov    $0x0,%esi
  mov    $0x0,%r9d
  mov    $0x0,%r10d
  jmp    L95
L189:
  mov    %r9d,%r12d
  jmp    L146
L47:
  mov    %r10d,%eax
  mov    %r9d,%ebp
  jmp    L26
L176:
  mov    %r10d,%eax
  mov    %r9d,%r13d
  jmp    L237
L185:
  mov    %r10d,%eax
L60:
  add    $0x3,%esi
  movslq %r12d,%r12
  shl    $0x6,%r13d
  or     %r13d,%eax
  mov    %al,(%rdi,%r12,1)
L87:
  add    $0x4,%rdx
  sub    $0x4,%ecx
  cmp    %r8d,%ecx
  je     L177
L95:
  movzbl (%rdx),%eax
  cmp    $0x60,%al
  je     L189
  sub    $0x20,%eax
  movzbl %al,%r12d
  test   $0xc0,%al
  jne    L195
L146:
  movzbl 0x1(%rdx),%eax
  cmp    $0x60,%al
  je     L47
  sub    $0x20,%eax
  movzbl %al,%ebp
  test   $0xc0,%al
  jne    L229
L26:
  lea    0x1(%rsi),%ebx
  movslq %esi,%r13
  shl    $0x2,%r12d
  shr    $0x4,%al
  or     %r12d,%eax
  mov    %al,(%rdi,%r13,1)
  cmp    $0x2,%ecx
  jle    L165
  movzbl 0x2(%rdx),%eax
  cmp    $0x60,%al
  je     L176
  sub    $0x20,%eax
  movzbl %al,%r13d
  test   $0xc0,%al
  jne    L78
L237:
  lea    0x2(%rsi),%r12d
  movslq %ebx,%rbx
  shl    $0x4,%ebp
  shr    $0x2,%al
  or     %ebp,%eax
  mov    %al,(%rdi,%rbx,1)
  cmp    $0x3,%ecx
  jle    L98
  movzbl 0x3(%rdx),%eax
  cmp    $0x60,%al
  je     L185
  sub    $0x20,%eax
  test   $0xc0,%al
  je     L60
  mov    $0xffffffff,%r11d
  jmp    L168
L165:
  mov    %ebx,%esi
  jmp    L87
L98:
  mov    %r12d,%esi
  jmp    L87
L177:
  cmp    %r11d,%esi
  mov    $0xfffffffd,%eax
  cmovne %eax,%r11d
L168:
  mov    %r11d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L212:
  mov    $0xfffffffe,%r11d
L75:
  mov    %r11d,%eax
  ret
L195:
  mov    $0xffffffff,%r11d
  jmp    L168
L229:
  mov    $0xffffffff,%r11d
  jmp    L168
L78:
  mov    $0xffffffff,%r11d
  jmp    L168
```

assistant: ```c
int fromuutobits(char *out, const char *in) {
  int len, outlen, inlen;
  register unsigned char digit1, digit2;
  outlen = (in[0] == '`' ? 0 : in[0] - ' ');
  in += 1;
  if (outlen < 0 || outlen > 45)
    return -2;
  if (outlen == 0)
    return 0;
  inlen = (outlen * 4 + 2) / 3;
  len = 0;
  for (; inlen > 0; inlen -= 4) {
    digit1 = (in[0] == '`' ? 0 : in[0] - ' ');
    if ((digit1 & ~63))
      return -1;
    digit2 = (in[1] == '`' ? 0 : in[1] - ' ');
    if ((digit2 & ~63))
      return -1;
    out[len++] = (digit1 << 2) | (digit2 >> 4);
    if (inlen > 2) {
      digit1 = (in[2] == '`' ? 0 : in[2] - ' ');
      if ((digit1 & ~63))
        return -1;
      out[len++] = (digit2 << 4) | (digit1 >> 2);
      if (inlen > 3) {
        digit2 = (in[3] == '`' ? 0 : in[3] - ' ');
        if ((digit2 & ~63))
          return -1;
        out[len++] = (digit1 << 6) | digit2;
      }
    }
    in += 4;
  }
  return len == outlen ? len : -3;
}
```