user: 请从给定的汇编指令推导出C源代码:

```asm
<intToRoman>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %edi,%ebx
  cmp    $0x3e7,%edi
  jle    L193
  lea    -0x3e8(%rdi),%esi
  mov    %rsi,%rax
  imul   $0x10624dd3,%rsi,%rsi
  shr    $0x26,%rsi
  lea    0x1(%rsi),%r8d
  cmp    $0x3a97,%eax
  jbe    L46
  mov    %r8d,%ecx
  movdqa D31(%rip),%xmm0
  movd   %edi,%xmm6
  and    $0xfffffff0,%ecx
  imul   $0xfffffc18,%ecx,%eax
  movaps %xmm0,D74(%rip)
  mov    %ecx,%edx
  pshufd $0x0,%xmm6,%xmm0
  paddd  D0(%rip),%xmm0
  add    %ebx,%eax
  pshufd $0xff,%xmm0,%xmm0
  cmp    %ecx,%r8d
  je     L120
L92:
  sub    %ecx,%esi
  lea    D74(%rip),%r12
  lea    0x1(%rsi),%edi
  cmp    $0x6,%esi
  jbe    L113
  mov    D31(%rip),%rsi
  movd   %eax,%xmm0
  movq   D38(%rip),%xmm1
  mov    %rsi,(%r12,%rcx,1)
  lea    -0x3e8(%rax),%ecx
  movd   %ecx,%xmm2
  lea    0x1(%rdx),%ecx
  punpckldq %xmm2,%xmm0
  movd   %ecx,%xmm4
  mov    %edi,%ecx
  paddd  %xmm1,%xmm0
  and    $0xfffffff8,%ecx
  movq   D51(%rip),%xmm1
  imul   $0xfffffc18,%ecx,%esi
  pshufd $0xe5,%xmm0,%xmm3
  movd   %edx,%xmm0
  movd   %xmm3,%ebx
  add    %ecx,%edx
  punpckldq %xmm4,%xmm0
  add    %esi,%eax
  paddd  %xmm1,%xmm0
  pshufd $0xe5,%xmm0,%xmm5
  movd   %xmm5,%ebp
  cmp    %ecx,%edi
  je     L68
L113:
  movslq %edx,%rcx
  lea    -0x3e8(%rax),%ebx
  lea    0x1(%rdx),%ebp
  movb   $0x4d,(%r12,%rcx,1)
  cmp    $0x3e7,%ebx
  jle    L68
  movslq %ebp,%rbp
  lea    -0x7d0(%rax),%ebx
  lea    0x2(%rdx),%ecx
  movb   $0x4d,(%r12,%rbp,1)
  cmp    $0x3e7,%ebx
  jle    L72
  movslq %ecx,%rcx
  lea    -0xbb8(%rax),%ebx
  lea    0x3(%rdx),%ebp
  movb   $0x4d,(%r12,%rcx,1)
  cmp    $0x3e7,%ebx
  jle    L68
  movslq %ebp,%rbp
  lea    -0xfa0(%rax),%ebx
  lea    0x4(%rdx),%ecx
  movb   $0x4d,(%r12,%rbp,1)
  cmp    $0x3e7,%ebx
  jle    L72
  movslq %ecx,%rcx
  lea    -0x1388(%rax),%ebx
  lea    0x5(%rdx),%ebp
  movb   $0x4d,(%r12,%rcx,1)
  cmp    $0x3e7,%ebx
  jle    L68
  movslq %ebp,%rbp
  lea    -0x1770(%rax),%ebx
  lea    0x6(%rdx),%ecx
  movb   $0x4d,(%r12,%rbp,1)
  cmp    $0x3e7,%ebx
  jle    L72
  movslq %ecx,%rcx
  lea    0x7(%rdx),%ebp
  lea    -0x1b58(%rax),%ebx
  movb   $0x4d,(%r12,%rcx,1)
L68:
  cmp    $0x63,%ebx
  jg     L122
  cmp    $0x9,%ebx
  jg     L153
  test   %ebx,%ebx
  jg     L209
L206:
  movslq %ebp,%rbp
  pop    %rbx
  mov    %r12,%rax
  movb   $0x0,(%r12,%rbp,1)
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopw   0x0(%rax,%rax,1)
L122:
  movslq %ebp,%rdi
  mov    $0x4d,%r9d
  mov    $0x43,%ecx
  mov    %ebx,%esi
  add    %r12,%rdi
  mov    $0x44,%r8d
  mov    $0x64,%edx
  call   <lt1000@plt>
  lea    0x0(%rbp,%rax,1),%r14d
  mov    %r14d,%ebp
L110:
  movslq %ebx,%r13
  mov    %ebx,%edx
  movslq %ebp,%rdi
  mov    %ebx,%esi
  imul   $0x51eb851f,%r13,%rax
  sar    $0x1f,%edx
  add    %r12,%rdi
  mov    $0x43,%r9d
  mov    $0x4c,%r8d
  mov    $0x58,%ecx
  sar    $0x25,%rax
  sub    %edx,%eax
  mov    $0xa,%edx
  imul   $0x64,%eax,%eax
  sub    %eax,%esi
  call   <lt1000@plt>
  add    %eax,%r14d
  mov    %r14d,%ebp
L53:
  imul   $0x66666667,%r13,%rax
  mov    %ebx,%edx
  movslq %ebp,%rdi
  mov    %ebx,%esi
  sar    $0x1f,%edx
  add    %r12,%rdi
  mov    $0x49,%ecx
  mov    $0x58,%r9d
  mov    $0x56,%r8d
  sar    $0x22,%rax
  sub    %edx,%eax
  mov    $0x1,%edx
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%esi
  call   <lt1000@plt>
  lea    (%r14,%rax,1),%ebp
  jmp    L206
  nopl   0x0(%rax,%rax,1)
L72:
  mov    %ecx,%ebp
  jmp    L68
  nop
L193:
  xor    %ebp,%ebp
  lea    D74(%rip),%r12
  jmp    L68
L46:
  mov    %edi,%eax
  xor    %ecx,%ecx
  xor    %edx,%edx
  jmp    L92
L209:
  mov    %ebp,%r14d
  movslq %ebx,%r13
  jmp    L53
L120:
  movd   %xmm0,%ebx
  mov    $0x10,%ebp
  lea    D74(%rip),%r12
  jmp    L68
L153:
  mov    %ebp,%r14d
  jmp    L110
```

tool_calls: name: extract_symbolic_data
arguments: label: D31
datatype: byte[16]
name: extract_symbolic_data
arguments: label: D0
datatype: byte[16]
name: extract_symbolic_data
arguments: label: D38
datatype: byte[8]
name: extract_symbolic_data
arguments: label: D51
datatype: byte[8]

tool: {"D31": [0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d]}

tool: {"D0": [0x38,0xcd,0xff,0xff,0x50,0xc9,0xff,0xff,0x68,0xc5,0xff,0xff,0x80,0xc1,0xff,0xff]}

tool: {"D38": [0xa8,0xe4,0xff,0xff,0xa8,0xe4,0xff,0xff]}

tool: {"D51": [0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00]}

assistant: ```c
char *intToRoman(int num) {
  int k = 0;
  static char out[16];
  while (num >= 1000) {
    out[k++] = 'M';
    num -= 1000;
  }
  if (num >= 100)
    k += lt1000(out + k, num % 1000, 100, 'C', 'D', 'M');
  if (num >= 10)
    k += lt1000(out + k, num % 100, 10, 'X', 'L', 'C');
  if (num >= 1)
    k += lt1000(out + k, num % 10, 1, 'I', 'V', 'X');
  out[k] = 0;
  return out;
}
```