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

```asm
<shove4444>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %esi,-0xc(%rbp)
  mov    %rdx,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  movsd  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jb     L91
  mov    -0x8(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D52(%rip),%xmm0
  comisd %xmm1,%xmm0
  jb     L91
  mov    $0x1,%eax
  jmp    L63
L91:
  mov    $0x0,%eax
L63:
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jb     L59
  mov    -0x8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  movsd  D52(%rip),%xmm0
  comisd %xmm1,%xmm0
  jb     L59
  mov    $0x1,%eax
  jmp    L113
L59:
  mov    $0x0,%eax
L113:
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jb     L67
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  movsd  D52(%rip),%xmm0
  comisd %xmm1,%xmm0
  jb     L67
  mov    $0x1,%eax
  jmp    L9
L67:
  mov    $0x0,%eax
L9:
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x8(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jb     L117
  mov    -0x8(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm1
  movsd  D52(%rip),%xmm0
  comisd %xmm1,%xmm0
  jb     L117
  mov    $0x1,%eax
  jmp    L30
L117:
  mov    $0x0,%eax
L30:
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x8(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D50(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  D47(%rip),%xmm0
  addsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%eax
  shl    $0xc,%eax
  mov    %eax,%ecx
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movzwl %cx,%eax
  mov    %eax,(%rdx)
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  movsd  D50(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  D47(%rip),%xmm0
  addsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%eax
  shl    $0x8,%eax
  and    $0xf00,%eax
  mov    %eax,%ecx
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rsi
  mov    -0x18(%rbp),%rax
  add    %rsi,%rax
  or     %ecx,%edx
  mov    %edx,(%rax)
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%ecx
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  movsd  D50(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  D47(%rip),%xmm0
  addsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%eax
  shl    $0x4,%eax
  movzbl %al,%edx
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rsi
  mov    -0x18(%rbp),%rax
  add    %rsi,%rax
  or     %ecx,%edx
  mov    %edx,(%rax)
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x8(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm1
  movsd  D50(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  D47(%rip),%xmm0
  addsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%eax
  and    $0xf,%eax
  mov    %eax,%ecx
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rsi
  mov    -0x18(%rbp),%rax
  add    %rsi,%rax
  or     %ecx,%edx
  mov    %edx,(%rax)
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: data_label: D52
datatype: f64
name: read_data
arguments: data_label: D50
datatype: f32[2]
name: read_data
arguments: data_label: D47
datatype: f64

tool: D52: 1

tool: {"D50": [0.0,2.71875]}

tool: D47: 0.5

assistant: ```c
void shove4444(const GLfloat shoveComponents[], int index, void *packedPixel) {
  assert(0.0 <= shoveComponents[0] && shoveComponents[0] <= 1.0);
  assert(0.0 <= shoveComponents[1] && shoveComponents[1] <= 1.0);
  assert(0.0 <= shoveComponents[2] && shoveComponents[2] <= 1.0);
  assert(0.0 <= shoveComponents[3] && shoveComponents[3] <= 1.0);
  ((GLushort *)packedPixel)[index] = ((GLushort)((shoveComponents[0] * 15) + 0.5) << 12) & 0xf000;
  ((GLushort *)packedPixel)[index] |= ((GLushort)((shoveComponents[1] * 15) + 0.5) << 8) & 0x0f00;
  ((GLushort *)packedPixel)[index] |= ((GLushort)((shoveComponents[2] * 15) + 0.5) << 4) & 0x00f0;
  ((GLushort *)packedPixel)[index] |= ((GLushort)((shoveComponents[3] * 15) + 0.5)) & 0x000f;
}
```