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

```asm
<send_cmd_fast>:
  endbr64
  mov    $0xc000a044,%eax
  mov    $0xc000a040,%edx
  mov    %rdi,%rsi
  orl    $0x2,(%rax)
  mov    (%rdx),%r8d
  lea    0x5(%rdi),%rdi
  xor    %eax,%eax
L278:
  and    $0xfffffffe,%r8d
  movzbl (%rsi),%ecx
  mov    %r8d,(%rdx)
  nop
  mov    (%rdx),%r8d
  test   %cl,%cl
  js     L197
  and    $0xfffffffd,%r8d
L264:
  mov    %r8d,(%rdx)
  add    %eax,%eax
  nop
  mov    %eax,%r8d
  mov    %ecx,%r11d
  xor    $0x9,%r8d
  xor    %al,%r11b
  cmovs  %r8d,%eax
  andl   $0xfffffffe,(%rdx)
  lea    (%rcx,%rcx,1),%r8d
  nop
  mov    (%rdx),%r9d
  test   %r8b,%r8b
  js     L78
  and    $0xfffffffd,%r9d
L228:
  mov    %r9d,(%rdx)
  add    %eax,%eax
  nop
  mov    %eax,%r9d
  xor    $0x9,%r9d
  xor    %al,%r8b
  lea    0x0(,%rcx,4),%r8d
  cmovs  %r9d,%eax
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%r9d
  test   %r8b,%r8b
  js     L65
  and    $0xfffffffd,%r9d
L171:
  mov    %r9d,(%rdx)
  add    %eax,%eax
  nop
  mov    %eax,%r9d
  xor    $0x9,%r9d
  xor    %al,%r8b
  lea    0x0(,%rcx,8),%r8d
  cmovs  %r9d,%eax
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%r9d
  test   %r8b,%r8b
  js     L295
  and    $0xfffffffd,%r9d
L292:
  mov    %r9d,(%rdx)
  add    %eax,%eax
  nop
  mov    %eax,%r9d
  xor    $0x9,%r9d
  xor    %al,%r8b
  mov    %ecx,%r8d
  cmovs  %r9d,%eax
  andl   $0xfffffffe,(%rdx)
  shl    $0x4,%r8d
  nop
  mov    (%rdx),%r9d
  test   %r8b,%r8b
  js     L211
  and    $0xfffffffd,%r9d
L311:
  mov    %r9d,(%rdx)
  add    %eax,%eax
  nop
  mov    %eax,%r9d
  xor    $0x9,%r9d
  xor    %al,%r8b
  mov    %ecx,%r8d
  cmovs  %r9d,%eax
  andl   $0xfffffffe,(%rdx)
  shl    $0x5,%r8d
  nop
  mov    (%rdx),%r9d
  test   %r8b,%r8b
  js     L242
  and    $0xfffffffd,%r9d
L296:
  mov    %r9d,(%rdx)
  add    %eax,%eax
  nop
  mov    %eax,%r9d
  xor    $0x9,%r9d
  xor    %al,%r8b
  mov    %ecx,%r8d
  cmovs  %r9d,%eax
  andl   $0xfffffffe,(%rdx)
  shl    $0x6,%r8d
  nop
  mov    (%rdx),%r9d
  test   %r8b,%r8b
  js     L194
  and    $0xfffffffd,%r9d
L100:
  mov    %r9d,(%rdx)
  add    %eax,%eax
  nop
  mov    %eax,%r9d
  xor    $0x9,%r9d
  xor    %al,%r8b
  cmovs  %r9d,%eax
  andl   $0xfffffffe,(%rdx)
  shl    $0x7,%ecx
  nop
  mov    (%rdx),%r8d
  test   %cl,%cl
  js     L123
  and    $0xfffffffd,%r8d
L259:
  mov    %r8d,(%rdx)
  add    %eax,%eax
  nop
  mov    (%rdx),%r9d
  mov    %eax,%r10d
  xor    $0x9,%r10d
  mov    %r9d,%r8d
  or     $0x1,%r8d
  xor    %al,%cl
  cmovs  %r10d,%eax
  add    $0x1,%rsi
  mov    %r8d,(%rdx)
  and    $0x7f,%eax
  cmp    %rdi,%rsi
  jne    L278
  mov    $0xc000a040,%edx
  and    $0xfffffffe,%r9d
  lea    0x1(%rax,%rax,1),%eax
  mov    %r9d,(%rdx)
  nop
  mov    (%rdx),%ecx
  test   %al,%al
  js     L318
  and    $0xfffffffd,%ecx
L326:
  mov    $0xc000a040,%edx
  mov    %ecx,(%rdx)
  nop
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%ecx
  test   $0x40,%al
  jne    L290
  and    $0xfffffffd,%ecx
L320:
  mov    $0xc000a040,%edx
  mov    %ecx,(%rdx)
  nop
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%ecx
  test   $0x20,%al
  jne    L80
  and    $0xfffffffd,%ecx
L160:
  mov    $0xc000a040,%edx
  mov    %ecx,(%rdx)
  nop
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%ecx
  test   $0x10,%al
  jne    L231
  and    $0xfffffffd,%ecx
L108:
  mov    $0xc000a040,%edx
  mov    %ecx,(%rdx)
  nop
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%ecx
  test   $0x8,%al
  jne    L89
  and    $0xfffffffd,%ecx
L60:
  mov    $0xc000a040,%edx
  mov    %ecx,(%rdx)
  nop
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%ecx
  test   $0x4,%al
  jne    L97
  and    $0xfffffffd,%ecx
L192:
  mov    $0xc000a040,%edx
  mov    %ecx,(%rdx)
  nop
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%ecx
  test   $0x2,%al
  jne    L224
  and    $0xfffffffd,%ecx
L246:
  mov    $0xc000a040,%edx
  mov    %ecx,(%rdx)
  nop
  andl   $0xfffffffe,(%rdx)
  nop
  mov    (%rdx),%ecx
  test   $0x1,%al
  jne    L222
  and    $0xfffffffd,%ecx
L167:
  mov    $0xc000a040,%edx
  mov    %ecx,(%rdx)
  nop
  orl    $0x1,(%rdx)
  ret
  cs nopw 0x0(%rax,%rax,1)
L123:
  or     $0x2,%r8d
  jmp    L259
  nopl   0x0(%rax)
L194:
  or     $0x2,%r9d
  jmp    L100
  nopl   0x0(%rax)
L242:
  or     $0x2,%r9d
  jmp    L296
  nopl   0x0(%rax)
L211:
  or     $0x2,%r9d
  jmp    L311
  nopl   0x0(%rax)
L295:
  or     $0x2,%r9d
  jmp    L292
  nopl   0x0(%rax)
L65:
  or     $0x2,%r9d
  jmp    L171
  nopl   0x0(%rax)
L78:
  or     $0x2,%r9d
  jmp    L228
  nopl   0x0(%rax)
L197:
  or     $0x2,%r8d
  jmp    L264
L318:
  or     $0x2,%ecx
  jmp    L326
L222:
  or     $0x2,%ecx
  jmp    L167
L224:
  or     $0x2,%ecx
  jmp    L246
L97:
  or     $0x2,%ecx
  jmp    L192
L89:
  or     $0x2,%ecx
  jmp    L60
L231:
  or     $0x2,%ecx
  jmp    L108
L80:
  or     $0x2,%ecx
  jmp    L160
L290:
  or     $0x2,%ecx
  jmp    L320
```

assistant: ```c
unsigned char send_cmd_fast(unsigned char *in) {
  int i, j;
  unsigned char b, crc = 0;
  *((unsigned int *)0xC000A044) |= (1 << 1);
  for (i = 0; i < 5; i++) {
    b = in[i];
    for (j = 0; j < 8; j++) {
      do {
        *((unsigned int *)0xC000A040) &= ~(1 << 0);
        asm volatile("nop");
      } while (0);
      if (b & 0x80)
        *((unsigned int *)0xC000A040) |= (1 << 1);
      else
        *((unsigned int *)0xC000A040) &= ~(1 << 1);
      crc <<= 1;
      do {
        asm volatile("nop");
        *((unsigned int *)0xC000A040) |= (1 << 0);
      } while (0);
      if ((crc ^ b) & 0x80)
        crc ^= 0x09;
      b <<= 1;
    }
    crc &= 0x7f;
  }
  crc = ((crc << 1) | 0x01);
  b = crc;
  for (j = 0; j < 8; j++) {
    do {
      *((unsigned int *)0xC000A040) &= ~(1 << 0);
      asm volatile("nop");
    } while (0);
    if (crc & 0x80)
      *((unsigned int *)0xC000A040) |= (1 << 1);
    else
      *((unsigned int *)0xC000A040) &= ~(1 << 1);
    do {
      asm volatile("nop");
      *((unsigned int *)0xC000A040) |= (1 << 0);
    } while (0);
    crc <<= 1;
  }
  return b;
}
```