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

```asm
<devredir_cvt_from_unicode_len>:
  endbr64
  mov    %rsi,%rcx
  mov    %edx,%r8d
  test   %edx,%edx
  jle    L54
  lea    -0x1(%rdx),%eax
  mov    %eax,%r9d
  shr    %r9d
  lea    0x1(%r9),%edx
  lea    -0x1(%rsi,%rdx,2),%rsi
  mov    %rdx,%r9
  cmp    %rsi,%rdi
  setae  %sil
  add    %rdi,%rdx
  cmp    %rdx,%rcx
  setae  %dl
  or     %dl,%sil
  je     L80
  cmp    $0x1f,%eax
  jbe    L80
  shr    $0x5,%eax
  movdqa D7(%rip),%xmm2
  mov    %eax,%edx
  xor    %eax,%eax
  mov    %rdx,%rsi
  shl    $0x4,%rdx
  nop
L1:
  movdqu (%rcx,%rax,2),%xmm0
  movdqu 0x10(%rcx,%rax,2),%xmm1
  pand   %xmm2,%xmm0
  pand   %xmm2,%xmm1
  packuswb %xmm1,%xmm0
  movups %xmm0,(%rdi,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L1
  mov    %esi,%eax
  mov    %esi,%edx
  shl    $0x5,%eax
  shl    $0x4,%edx
  movslq %eax,%rsi
  lea    0x1(%rdx),%r10d
  movzbl (%rcx,%rsi,1),%r11d
  mov    %edx,%esi
  mov    %r11b,(%rdi,%rsi,1)
  lea    0x2(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r10d,%r10
  lea    0x2(%rdx),%r11d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r10,1)
  lea    0x4(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r11d,%r11
  lea    0x3(%rdx),%r10d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r11,1)
  lea    0x6(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r10d,%r10
  lea    0x4(%rdx),%r11d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r10,1)
  lea    0x8(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r11d,%r11
  lea    0x5(%rdx),%r10d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r11,1)
  lea    0xa(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r10d,%r10
  lea    0x6(%rdx),%r11d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r10,1)
  lea    0xc(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r11d,%r11
  lea    0x7(%rdx),%r10d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r11,1)
  lea    0xe(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r10d,%r10
  lea    0x8(%rdx),%r11d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r10,1)
  lea    0x10(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r11d,%r11
  lea    0x9(%rdx),%r10d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r11,1)
  lea    0x12(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r10d,%r10
  lea    0xa(%rdx),%r11d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r10,1)
  lea    0x14(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r11d,%r11
  lea    0xb(%rdx),%r10d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r11,1)
  lea    0x16(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r10d,%r10
  lea    0xc(%rdx),%r11d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r10,1)
  lea    0x18(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r11d,%r11
  lea    0xd(%rdx),%r10d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r11,1)
  lea    0x1a(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r10d,%r10
  lea    0xe(%rdx),%r11d
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r10,1)
  lea    0x1c(%rax),%esi
  cmp    %esi,%r8d
  jle    L173
  movslq %esi,%rsi
  movslq %r11d,%r11
  add    $0x1e,%eax
  add    $0xf,%edx
  movzbl (%rcx,%rsi,1),%esi
  mov    %sil,(%rdi,%r11,1)
  cmp    %eax,%r8d
  jle    L173
  cltq
  movslq %edx,%rdx
  movzbl (%rcx,%rax,1),%eax
  mov    %al,(%rdi,%rdx,1)
  nopw   0x0(%rax,%rax,1)
L173:
  movslq %r9d,%r9
  add    %r9,%rdi
L54:
  movb   $0x0,(%rdi)
  ret
  nopw   0x0(%rax,%rax,1)
L80:
  mov    %r9d,%esi
  xor    %eax,%eax
  nopl   (%rax)
L126:
  movzbl (%rcx,%rax,2),%edx
  mov    %dl,(%rdi,%rax,1)
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L126
  jmp    L173
```

tool_calls: name: disassemble_data
arguments: data_tag: D7
type_guessed: byte[16]

tool: {"D7": [0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00]}

assistant: ```c
void devredir_cvt_from_unicode_len(char *path, char *unicode, int len) {
  int i;
  int j;
  for (i = 0, j = 0; i < len; i += 2) {
    path[j++] = unicode[i];
  }
  path[j] = 0;
}
```