user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<inverse_dit_butterfly_fixed>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x8,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  mov    -0x70(%rbp),%rax
  sar    %rax
  mov    %rax,-0x30(%rbp)
  mov    -0x70(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  movq   $0x2,-0x28(%rbp)
  jmp    L47
L18:
  mov    -0x68(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  jmp    L38
L0:
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  movq   $0x0,-0x38(%rbp)
  jmp    L41
L56:
  mov    -0x38(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  mov    %ax,-0x54(%rbp)
  mov    -0x38(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movzwl (%rax),%eax
  mov    %ax,-0x52(%rbp)
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x20(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x48(%rbp),%eax
  movslq %eax,%rdx
  movswq -0x54(%rbp),%rax
  imul   %rdx,%rax
  sar    $0xf,%rax
  mov    %eax,%ecx
  mov    -0x44(%rbp),%eax
  movslq %eax,%rdx
  movswq -0x52(%rbp),%rax
  imul   %rdx,%rax
  sar    $0xf,%rax
  mov    %eax,%edx
  mov    %ecx,%eax
  sub    %edx,%eax
  mov    %eax,-0x40(%rbp)
  mov    -0x48(%rbp),%eax
  movslq %eax,%rdx
  movswq -0x52(%rbp),%rax
  imul   %rdx,%rax
  sar    $0xf,%rax
  mov    %eax,%ecx
  mov    -0x44(%rbp),%eax
  movslq %eax,%rdx
  movswq -0x54(%rbp),%rax
  imul   %rdx,%rax
  sar    $0xf,%rax
  add    %ecx,%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0x50(%rbp),%edx
  mov    -0x40(%rbp),%eax
  add    %eax,%edx
  mov    -0x20(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  mov    -0x4c(%rbp),%ecx
  mov    -0x3c(%rbp),%edx
  add    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x50(%rbp),%eax
  sub    -0x40(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x4c(%rbp),%eax
  sub    -0x3c(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x30(%rbp),%rax
  add    %rax,-0x38(%rbp)
  addq   $0x8,-0x20(%rbp)
  addq   $0x8,-0x18(%rbp)
L41:
  mov    -0x20(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jb     L56
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x28(%rbp),%rax
  shl    $0x2,%rax
  add    %rax,-0x18(%rbp)
L38:
  mov    -0x18(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jb     L0
  shlq   -0x28(%rbp)
  sarq   -0x30(%rbp)
L47:
  cmpq   $0x0,-0x30(%rbp)
  jg     L18
  nop
  nop
  leave
  ret
```

assistant: ```c
void inverse_dit_butterfly_fixed(int *data, long size, short *cos_ang, short *sin_ang) {
  long angle, astep, dl;
  int xr, yr, xi, yi, dr, di;
  short wr, wi;
  int *l1, *l2, *end, *ol2;
  astep = size >> 1;
  end = data + size + size;
  for (dl = 2; astep > 0; dl += dl, astep >>= 1) {
    l1 = data;
    l2 = data + dl;
    for (; l2 < end; l1 = l2, l2 = l2 + dl) {
      ol2 = l2;
      for (angle = 0; l1 < ol2; l1 += 2, l2 += 2) {
        wr = cos_ang[angle];
        wi = sin_ang[angle];
        xr = *l1;
        xi = *(l1 + 1);
        yr = *l2;
        yi = *(l2 + 1);
        dr = ((int)(((long long)(yr) * (long long)(wr)) >> (15))) - ((int)(((long long)(yi) * (long long)(wi)) >> (15)));
        di = ((int)(((long long)(yr) * (long long)(wi)) >> (15))) + ((int)(((long long)(yi) * (long long)(wr)) >> (15)));
        *(l1) = xr + dr;
        *(l1 + 1) = xi + di;
        *(l2) = xr - dr;
        *(l2 + 1) = xi - di;
        angle += astep;
      }
    }
  }
}
```