user: 请将以下的汇编代码转换成C语言代码:

```asm
<rtime_decompress>:
  endbr64
  push   %r15
  mov    $0x400,%edx
  mov    %ecx,%r15d
  push   %r14
  mov    %rsi,%r14
  xor    %esi,%esi
  push   %r13
  mov    %rdi,%r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x418,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x408(%rsp)
  xor    %eax,%eax
  mov    %rsp,%rdi
  call   <memset@plt>
  test   %r15d,%r15d
  jle    L57
  xor    %edx,%edx
  lea    0x1(%r14),%r12
  jmp    L177
  nopl   (%rax)
L143:
  lea    (%rbx,%rsi,1),%eax
  cmp    %ebp,%eax
  jge    L189
  movslq %ebp,%rdi
  mov    %ebx,%edx
  add    %r14,%rsi
  add    %r14,%rdi
  call   <memcpy@plt>
  lea    0x0(%rbp,%rbx,1),%edx
L6:
  add    $0x2,%r13
  cmp    %r15d,%edx
  jge    L57
L177:
  movzbl 0x0(%r13),%eax
  movslq %edx,%rcx
  lea    0x1(%rdx),%ebp
  mov    %al,(%r14,%rcx,1)
  movzbl 0x1(%r13),%ebx
  movslq (%rsp,%rax,4),%rsi
  mov    %ebp,(%rsp,%rax,4)
  mov    %ebx,%edi
  test   %ebx,%ebx
  jne    L143
  mov    %ebp,%edx
  add    $0x2,%r13
  cmp    %r15d,%edx
  jl     L177
L57:
  mov    0x408(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L239
  add    $0x418,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L189:
  movslq %esi,%r9
  mov    %rcx,%rax
  lea    -0x1(%rbx),%r8d
  sub    %r9,%rax
  cmp    $0xe,%rax
  jbe    L158
  cmp    $0x6,%r8d
  jbe    L158
  cmp    $0xe,%r8d
  jbe    L256
  lea    (%r14,%r9,1),%rdi
  mov    %ebx,%r10d
  lea    0x1(%r14,%rcx,1),%rax
  movdqu (%rdi),%xmm0
  shr    $0x4,%r10d
  movups %xmm0,(%rax)
  cmp    $0x1,%r10d
  je     L167
  movdqu 0x10(%rdi),%xmm1
  movups %xmm1,0x10(%rax)
  cmp    $0x2,%r10d
  je     L167
  movdqu 0x20(%rdi),%xmm2
  movups %xmm2,0x20(%rax)
  cmp    $0x3,%r10d
  je     L167
  movdqu 0x30(%rdi),%xmm3
  movups %xmm3,0x30(%rax)
  cmp    $0x4,%r10d
  je     L167
  movdqu 0x40(%rdi),%xmm4
  movups %xmm4,0x40(%rax)
  cmp    $0x5,%r10d
  je     L167
  movdqu 0x50(%rdi),%xmm5
  movups %xmm5,0x50(%rax)
  cmp    $0x6,%r10d
  je     L167
  movdqu 0x60(%rdi),%xmm6
  movups %xmm6,0x60(%rax)
  cmp    $0x7,%r10d
  je     L167
  movdqu 0x70(%rdi),%xmm7
  movups %xmm7,0x70(%rax)
  cmp    $0x8,%r10d
  je     L167
  movdqu 0x80(%rdi),%xmm7
  movups %xmm7,0x80(%rax)
  cmp    $0x9,%r10d
  je     L167
  movdqu 0x90(%rdi),%xmm6
  movups %xmm6,0x90(%rax)
  cmp    $0xa,%r10d
  je     L167
  movdqu 0xa0(%rdi),%xmm5
  movups %xmm5,0xa0(%rax)
  cmp    $0xb,%r10d
  je     L167
  movdqu 0xb0(%rdi),%xmm4
  movups %xmm4,0xb0(%rax)
  cmp    $0xc,%r10d
  je     L167
  movdqu 0xc0(%rdi),%xmm7
  movups %xmm7,0xc0(%rax)
  cmp    $0xd,%r10d
  je     L167
  movdqu 0xd0(%rdi),%xmm6
  movups %xmm6,0xd0(%rax)
  cmp    $0xf,%r10d
  jne    L167
  movdqu 0xe0(%rdi),%xmm5
  movups %xmm5,0xe0(%rax)
  xchg   %ax,%ax
L167:
  mov    %ebx,%eax
  mov    %ebx,%edi
  and    $0xfffffff0,%eax
  add    %eax,%ebp
  add    %eax,%esi
  sub    %eax,%edi
  cmp    %eax,%ebx
  je     L108
L62:
  sub    %eax,%ebx
  lea    -0x1(%rbx),%r10d
  cmp    $0x6,%r10d
  jbe    L75
  add    %r14,%r9
  add    %r14,%rcx
  mov    (%r9,%rax,1),%r9
  mov    %r9,0x1(%rax,%rcx,1)
  mov    %ebx,%eax
  and    $0xfffffff8,%eax
  add    %eax,%ebp
  add    %eax,%esi
  sub    %eax,%edi
  cmp    %eax,%ebx
  je     L108
L75:
  movslq %esi,%r9
  lea    0x1(%rsi),%ecx
  lea    0x1(%rbp),%eax
  movzbl (%r14,%r9,1),%r10d
  movslq %ebp,%r9
  mov    %r10b,(%r14,%r9,1)
  cmp    $0x1,%edi
  je     L108
  movslq %ecx,%rcx
  lea    0x2(%rsi),%r10d
  lea    0x2(%rbp),%r9d
  cltq
  movzbl (%r14,%rcx,1),%ecx
  mov    %cl,(%r14,%rax,1)
  cmp    $0x2,%edi
  je     L108
  movslq %r10d,%r10
  lea    0x3(%rsi),%ecx
  lea    0x3(%rbp),%eax
  movslq %r9d,%r9
  movzbl (%r14,%r10,1),%r10d
  mov    %r10b,(%r14,%r9,1)
  cmp    $0x3,%edi
  je     L108
  movslq %ecx,%rcx
  lea    0x4(%rsi),%r10d
  lea    0x4(%rbp),%r9d
  cltq
  movzbl (%r14,%rcx,1),%ecx
  mov    %cl,(%r14,%rax,1)
  cmp    $0x4,%edi
  je     L108
  movslq %r10d,%r10
  lea    0x5(%rsi),%ecx
  lea    0x5(%rbp),%eax
  movslq %r9d,%r9
  movzbl (%r14,%r10,1),%r10d
  mov    %r10b,(%r14,%r9,1)
  cmp    $0x5,%edi
  je     L108
  movslq %ecx,%rcx
  cltq
  add    $0x6,%esi
  add    $0x6,%ebp
  movzbl (%r14,%rcx,1),%ecx
  mov    %cl,(%r14,%rax,1)
  cmp    $0x6,%edi
  je     L108
  movslq %esi,%rsi
  movslq %ebp,%rbp
  movzbl (%r14,%rsi,1),%eax
  mov    %al,(%r14,%rbp,1)
L108:
  lea    0x2(%rdx,%r8,1),%edx
  jmp    L6
  nopl   (%rax)
L158:
  lea    (%r12,%r9,1),%r10
  lea    -0x1(%rbx),%esi
  lea    (%r14,%r9,1),%rax
  add    %rsi,%r10
  xchg   %ax,%ax
L281:
  movzbl (%rax),%edi
  mov    %rax,%rsi
  add    $0x1,%rax
  sub    %r9,%rsi
  mov    %dil,0x1(%rsi,%rcx,1)
  cmp    %r10,%rax
  jne    L281
  jmp    L108
L256:
  xor    %eax,%eax
  jmp    L62
L239:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen) {
  int positions[256];
  int outpos = 0;
  int pos = 0;
  memset(positions, 0, sizeof(positions));
  while (outpos < destlen) {
    unsigned char value;
    int backoffs;
    int repeat;
    value = data_in[pos++];
    cpage_out[outpos++] = value;
    repeat = data_in[pos++];
    backoffs = positions[value];
    positions[value] = outpos;
    if (repeat) {
      if (backoffs + repeat >= outpos) {
        while (repeat) {
          cpage_out[outpos++] = cpage_out[backoffs++];
          repeat--;
        }
      } else {
        memcpy(&cpage_out[outpos], &cpage_out[backoffs], repeat);
        outpos += repeat;
      }
    }
  }
}
```