user: What is the c source code of the assembly code below:

```asm
<ivtv_api_dec_speed>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  movss  %xmm0,-0x2c(%rbp)
  movss  -0x2c(%rbp),%xmm0
  cvttss2si %xmm0,%eax
  mov    %eax,-0x20(%rbp)
  movl   $0x1,-0x1c(%rbp)
  movl   $0x0,-0x18(%rbp)
  movl   $0x0,-0x14(%rbp)
  movl   $0x0,-0x10(%rbp)
  movl   $0x1,-0xc(%rbp)
  movl   $0x3,-0x8(%rbp)
  movl   $0x7,-0x4(%rbp)
  cmpl   $0x1,-0x28(%rbp)
  jle    L23
  movl   $0x1,-0x28(%rbp)
  jmp    L112
L23:
  cmpl   $0x0,-0x28(%rbp)
  jns    L112
  movl   $0x0,-0x28(%rbp)
L112:
  cmpl   $0x0,-0x20(%rbp)
  jns    L188
  movss  D17(%rip),%xmm0
  movss  %xmm0,-0x2c(%rbp)
  movl   $0x1e,-0x20(%rbp)
L188:
  cmpl   $0x0,-0x28(%rbp)
  jne    L201
  movss  D17(%rip),%xmm0
  comiss -0x2c(%rbp),%xmm0
  jbe    L214
  movss  D17(%rip),%xmm0
  divss  -0x2c(%rbp),%xmm0
  cvttss2si %xmm0,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x4(%rbp),%edi
  mov    -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%esi
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  push   $0x0
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L214:
  movss  -0x2c(%rbp),%xmm0
  ucomiss D17(%rip),%xmm0
  jp     L187
  movss  -0x2c(%rbp),%xmm0
  ucomiss D17(%rip),%xmm0
  jne    L187
  mov    -0x4(%rbp),%esi
  mov    -0x28(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  push   $0x0
  mov    %esi,%r9d
  mov    %ecx,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L187:
  movss  -0x2c(%rbp),%xmm0
  ucomiss D107(%rip),%xmm0
  jp     L233
  movss  -0x2c(%rbp),%xmm0
  ucomiss D107(%rip),%xmm0
  jne    L233
  movl   $0x1,-0x20(%rbp)
  mov    -0x4(%rbp),%edi
  mov    -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%esi
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  push   $0x0
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    $0x1,%ecx
  mov    $0x0,%edx
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L233:
  movss  -0x2c(%rbp),%xmm0
  comiss D88(%rip),%xmm0
  jbe    L95
  mov    -0xc(%rbp),%esi
  mov    -0x28(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  push   $0x0
  mov    %esi,%r9d
  mov    %ecx,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L95:
  movl   $0x2,-0x20(%rbp)
  mov    -0x4(%rbp),%edi
  mov    -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%esi
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  push   $0x0
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    $0x1,%ecx
  mov    $0x0,%edx
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L201:
  movss  D17(%rip),%xmm0
  comiss -0x2c(%rbp),%xmm0
  jbe    L153
  movss  D17(%rip),%xmm0
  divss  -0x2c(%rbp),%xmm0
  cvttss2si %xmm0,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x8(%rbp),%edi
  mov    -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%esi
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  mov    -0x1c(%rbp),%edx
  push   %rdx
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L153:
  movss  -0x2c(%rbp),%xmm0
  ucomiss D17(%rip),%xmm0
  jp     L97
  movss  -0x2c(%rbp),%xmm0
  ucomiss D17(%rip),%xmm0
  jne    L97
  mov    -0x8(%rbp),%esi
  mov    -0x28(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  mov    -0x1c(%rbp),%edx
  push   %rdx
  mov    %esi,%r9d
  mov    %ecx,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L97:
  movss  -0x2c(%rbp),%xmm0
  ucomiss D107(%rip),%xmm0
  jp     L256
  movss  -0x2c(%rbp),%xmm0
  ucomiss D107(%rip),%xmm0
  jne    L256
  movl   $0x1,-0x20(%rbp)
  mov    -0x8(%rbp),%edi
  mov    -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%esi
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  mov    -0x1c(%rbp),%edx
  push   %rdx
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    $0x1,%ecx
  mov    $0x0,%edx
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L256:
  movss  -0x2c(%rbp),%xmm0
  comiss D88(%rip),%xmm0
  jbe    L10
  mov    -0xc(%rbp),%esi
  mov    -0x28(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  mov    -0x1c(%rbp),%edx
  push   %rdx
  mov    %esi,%r9d
  mov    %ecx,%r8d
  mov    $0x0,%ecx
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
  jmp    L168
L10:
  movl   $0x2,-0x20(%rbp)
  mov    -0x4(%rbp),%edi
  mov    -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%esi
  mov    -0x24(%rbp),%eax
  mov    -0x10(%rbp),%edx
  push   %rdx
  mov    -0x14(%rbp),%edx
  push   %rdx
  mov    -0x18(%rbp),%edx
  push   %rdx
  mov    -0x1c(%rbp),%edx
  push   %rdx
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    $0x1,%ecx
  mov    $0x0,%edx
  mov    %eax,%edi
  call   <__ivtv_api_dec_speed@plt>
  add    $0x20,%rsp
L168:
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D17
data_type: byte[4]
name: extract_symbolic_data
arguments: label: D107
data_type: byte[4]
name: extract_symbolic_data
arguments: label: D88
data_type: byte[4]

tool: {"D17": [0x00,0x00,0xf0,0x41]}

tool: {"D107": [0x00,0x00,0x34,0x42]}

tool: {"D88": [0x00,0x00,0x70,0x42]}

assistant: ```c
int ivtv_api_dec_speed(int ivtvfd, int direction, float fps) {
  int _speed = (int)fps;
  int b_per_gop = 1;
  int aud_mute = 0;
  int fr_field = 0;
  int mute = 0;
  int i_frames = 1;
  int ip_frames = 3;
  int ipb_frames = 7;
  if (direction > 1)
    direction = 1;
  else if (direction < 0)
    direction = 0;
  if (_speed < 0)
    _speed = fps = 30;
  if (direction == 0) {
    if (fps < 30) {
      _speed = 30 / fps;
      __ivtv_api_dec_speed(ivtvfd, _speed, 0, 0, direction, ipb_frames, 0, aud_mute, fr_field, mute);
    } else if (fps == 30) {
      __ivtv_api_dec_speed(ivtvfd, 0, 0, 0, direction, ipb_frames, 0, aud_mute, fr_field, mute);
    } else if (fps == (1.5 * 30)) {
      _speed = 1;
      __ivtv_api_dec_speed(ivtvfd, _speed, 0, 1, direction, ipb_frames, 0, aud_mute, fr_field, mute);
    } else if (fps > (2 * 30)) {
      __ivtv_api_dec_speed(ivtvfd, 0, 0, 0, direction, i_frames, 0, aud_mute, fr_field, mute);
    } else {
      _speed = 2;
      __ivtv_api_dec_speed(ivtvfd, _speed, 0, 1, direction, ipb_frames, 0, aud_mute, fr_field, mute);
    }
  } else {
    if (fps < 30) {
      _speed = 30 / fps;
      __ivtv_api_dec_speed(ivtvfd, _speed, 0, 0, direction, ip_frames, b_per_gop, aud_mute, fr_field, mute);
    } else if (fps == 30) {
      __ivtv_api_dec_speed(ivtvfd, 0, 0, 0, direction, ip_frames, b_per_gop, aud_mute, fr_field, mute);
    } else if (fps == (1.5 * 30)) {
      _speed = 1;
      __ivtv_api_dec_speed(ivtvfd, _speed, 0, 1, direction, ip_frames, b_per_gop, aud_mute, fr_field, mute);
    } else if (fps > (2 * 30)) {
      __ivtv_api_dec_speed(ivtvfd, 0, 0, 0, direction, i_frames, b_per_gop, aud_mute, fr_field, mute);
    } else {
      _speed = 2;
      __ivtv_api_dec_speed(ivtvfd, _speed, 0, 1, direction, ipb_frames, b_per_gop, aud_mute, fr_field, mute);
    }
  }
  return 0;
}
```