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

```asm
<outfloat>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %edi,%ebp
  mov    %esi,%edi
  mov    %edx,%r9d
  mov    %ecx,%r10d
  mov    %r8,%rbx
  mov    %edx,%r8d
  pxor   %xmm3,%xmm3
  movapd %xmm0,%xmm1
  xorpd  D36(%rip),%xmm1
  movapd %xmm0,%xmm2
  cmpltsd %xmm3,%xmm2
  andpd  %xmm2,%xmm1
  andnpd %xmm0,%xmm2
  orpd   %xmm2,%xmm1
  test   %esi,%esi
  jle    L106
  mov    $0x0,%eax
  movsd  D37(%rip),%xmm2
L82:
  mulsd  %xmm2,%xmm1
  add    $0x1,%eax
  cmp    %eax,%edi
  jne    L82
  addsd  D24(%rip),%xmm1
  cvttsd2si %xmm1,%eax
  mov    $0x2,%edx
  jmp    L125
L106:
  addsd  D24(%rip),%xmm1
  cvttsd2si %xmm1,%eax
  cmp    $0x1,%esi
  sbb    %edx,%edx
  add    $0x2,%edx
L125:
  add    %edi,%edx
  cmp    %ebp,%edx
  jg     L153
  movslq %ebp,%r12
  lea    -0x1(%r12),%r15
  lea    (%rbx,%r15,1),%rcx
  movslq %edi,%rdx
  mov    %r12,%r14
  sub    %rdx,%r14
  lea    (%rbx,%r14,1),%r13
  cmp    %r13,%rcx
  jb     L190
  sub    $0x1,%r13
  mov    %rcx,%rsi
L48:
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  sar    $0x22,%rdx
  mov    %eax,%r11d
  sar    $0x1f,%r11d
  sub    %r11d,%edx
  lea    (%rdx,%rdx,4),%r11d
  add    %r11d,%r11d
  sub    %r11d,%eax
  add    $0x30,%eax
  mov    %al,(%rsi)
  mov    %edx,%eax
  sub    $0x1,%rsi
  cmp    %r13,%rsi
  jne    L48
  sub    %r15,%r14
  lea    -0x1(%rcx,%r14,1),%rcx
L190:
  test   %edi,%edi
  jle    L179
  movb   $0x2e,(%rcx)
  lea    -0x1(%rcx),%rcx
L179:
  test   %eax,%eax
  jne    L137
  movb   $0x30,(%rcx)
  lea    -0x1(%rcx),%rcx
L110:
  pxor   %xmm1,%xmm1
  comisd %xmm0,%xmm1
  jbe    L168
  cmp    %rcx,%rbx
  ja     L287
L168:
  test   %r10d,%r10d
  jne    L148
  lea    -0x1(%rbx),%rdx
  mov    %rcx,%rax
  cmp    %rcx,%rbx
  ja     L1
L278:
  mov    %r8b,(%rax)
  sub    $0x1,%rax
  cmp    %rdx,%rax
  jne    L278
L1:
  pxor   %xmm1,%xmm1
  comisd %xmm0,%xmm1
  jbe    L79
  cmp    $0x20,%r9b
  je     L94
  movb   $0x2d,(%rbx)
  jmp    L79
L153:
  mov    %rbx,%rsi
  mov    %ebp,%edi
  mov    $0x0,%eax
  call   <e_outfloat@plt>
  movslq %ebp,%rbp
  lea    (%rbx,%rbp,1),%rax
  jmp    L295
L287:
  mov    %rbx,%rsi
  mov    %ebp,%edi
  mov    $0x0,%eax
  call   <e_outfloat@plt>
  lea    (%rbx,%r12,1),%rax
  jmp    L295
L148:
  lea    0x1(%rcx),%rdx
  lea    0x1(%rbx),%rax
  pxor   %xmm1,%xmm1
  comisd %xmm0,%xmm1
  cmovbe %rbx,%rax
  lea    (%rbx,%r12,1),%rdi
  cmp    %rdi,%rdx
  jae    L293
  lea    -0x1(%rdi),%r9
  sub    %rcx,%r9
  mov    $0x0,%edx
L178:
  movzbl 0x1(%rcx,%rdx,1),%esi
  mov    %sil,(%rax,%rdx,1)
  add    $0x1,%rdx
  cmp    %rdx,%r9
  jne    L178
  add    %r9,%rax
L293:
  cmp    %rax,%rdi
  jbe    L141
L135:
  mov    %r8b,(%rax)
  add    $0x1,%rax
  cmp    %rdi,%rax
  jne    L135
L141:
  pxor   %xmm1,%xmm1
  comisd %xmm0,%xmm1
  ja     L198
L79:
  lea    (%rbx,%r12,1),%rax
L295:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L198:
  movb   $0x2d,(%rbx)
  jmp    L79
L94:
  movb   $0x2d,(%rcx)
  jmp    L79
L137:
  cmp    %rbx,%rcx
  jb     L232
L238:
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  sar    $0x22,%rdx
  mov    %eax,%esi
  sar    $0x1f,%esi
  sub    %esi,%edx
  lea    (%rdx,%rdx,4),%esi
  add    %esi,%esi
  sub    %esi,%eax
  add    $0x30,%eax
  mov    %al,(%rcx)
  mov    %edx,%eax
  sub    $0x1,%rcx
  test   %edx,%edx
  je     L78
  cmp    %rcx,%rbx
  jbe    L238
L78:
  test   %eax,%eax
  je     L110
L232:
  mov    %rbx,%rsi
  mov    %ebp,%edi
  mov    $0x0,%eax
  call   <e_outfloat@plt>
  lea    (%rbx,%r12,1),%rax
  jmp    L295
```

tool_calls: name: unpack_data
arguments: data_tag: D36
data_type: f32[4]
name: unpack_data
arguments: data_tag: D37
data_type: f64
name: unpack_data
arguments: data_tag: D24
data_type: f64

tool: {"D36": [0.0,-0.0,0.0,0.0]}

tool: D37: 10

tool: D24: 0.5

assistant: ```c
char *outfloat(value, width, nplace, fill_char, left_justify, p)
double value;
int width, nplace;
char fill_char;
int left_justify;
register char *p;
{
  register int i, intval;
  register char *place, *to, *from;
  int negative;
  negative = value < 0.0 ? 1 : 0;
  if (negative)
    value = -value;
  for (i = 0; i < nplace; i++)
    value *= 10.0;
  intval = value + 0.5;
  if (nplace + (nplace == 0 ? 1 : 2) > width) {
    e_outfloat(width, p);
    return p + width;
  }
  for (place = p + width - 1; place >= p + width - nplace; place--) {
    *place = '0' + intval % 10;
    intval /= 10;
  }
  if (nplace > 0)
    *place-- = '.';
  if (intval == 0)
    *place-- = '0';
  for (; place >= p; place--) {
    if (intval == 0)
      break;
    else {
      *place = '0' + intval % 10;
      intval /= 10;
    }
  }
  if (intval != 0) {
    e_outfloat(width, p);
    return p + width;
  }
  if (place < p && negative) {
    e_outfloat(width, p);
    return p + width;
  }
  if (left_justify) {
    for (from = place + 1, to = (negative ? p + 1 : p); from < p + width; from++, to++)
      *to = *from;
    for (; to < p + width; to++)
      *to = fill_char;
    if (negative)
      *p = '-';
  } else {
    for (to = place; to >= p; to--)
      *to = fill_char;
    if (negative) {
      if (fill_char == ' ')
        *place = '-';
      else
        *p = '-';
    }
  }
  return p + width;
}
```