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

```asm
<idct_row>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  or     %eax,%edx
  mov    -0x58(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  or     %edx,%eax
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  je     L17
  mov    -0x58(%rbp),%rax
  mov    (%rax),%eax
  sar    %eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  shl    $0x10,%eax
  or     %eax,-0x4(%rbp)
  mov    -0x58(%rbp),%rax
  mov    -0x4(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x58(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x4(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x58(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x4(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x58(%rbp),%rax
  lea    0xc(%rax),%rdx
  mov    -0x4(%rbp),%eax
  mov    %eax,(%rdx)
  jmp    L15
L17:
  mov    -0x58(%rbp),%rax
  mov    (%rax),%eax
  shl    $0xb,%eax
  add    $0x800,%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x58(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0xb,%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x58(%rbp),%rax
  mov    0xc(%rax),%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x50(%rbp),%edx
  mov    -0x48(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x40(%rbp)
  mov    -0x50(%rbp),%eax
  sub    -0x48(%rbp),%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0x44(%rbp),%edx
  mov    -0x4c(%rbp),%eax
  add    %edx,%eax
  imul   $0x454,%eax,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x4c(%rbp),%eax
  imul   $0x620,%eax,%edx
  mov    -0x38(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x44(%rbp),%eax
  imul   $0xfffff138,%eax,%edx
  mov    -0x38(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x30(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x3c(%rbp),%eax
  sub    -0x30(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x40(%rbp),%eax
  sub    -0x34(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x58(%rbp),%rax
  mov    0x10(%rax),%eax
  mov    %eax,-0x50(%rbp)
  mov    -0x58(%rbp),%rax
  mov    0x14(%rax),%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x58(%rbp),%rax
  mov    0x18(%rax),%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x58(%rbp),%rax
  mov    0x1c(%rax),%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x44(%rbp),%edx
  mov    -0x50(%rbp),%eax
  add    %edx,%eax
  imul   $0x235,%eax,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x50(%rbp),%eax
  imul   $0x8e4,%eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x40(%rbp)
  mov    -0x44(%rbp),%eax
  imul   $0xfffff2b2,%eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0x4c(%rbp),%edx
  mov    -0x48(%rbp),%eax
  add    %edx,%eax
  imul   $0x968,%eax,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x48(%rbp),%eax
  imul   $0xfffffce1,%eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x4c(%rbp),%eax
  imul   $0xfffff04f,%eax,%edx
  mov    -0x18(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x30(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x34(%rbp),%eax
  sub    %eax,-0x40(%rbp)
  mov    -0x30(%rbp),%eax
  sub    %eax,-0x3c(%rbp)
  mov    -0x40(%rbp),%edx
  mov    -0x3c(%rbp),%eax
  add    %edx,%eax
  sar    $0x8,%eax
  imul   $0xb5,%eax,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x40(%rbp),%eax
  sub    -0x3c(%rbp),%eax
  sar    $0x8,%eax
  imul   $0xb5,%eax,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  sar    $0xc,%eax
  mov    %eax,%edx
  mov    -0x58(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %eax,%edx
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  sar    $0xc,%edx
  mov    %edx,(%rax)
  mov    -0x24(%rbp),%edx
  mov    -0x8(%rbp),%eax
  add    %eax,%edx
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  sar    $0xc,%edx
  mov    %edx,(%rax)
  mov    -0x20(%rbp),%edx
  mov    -0x10(%rbp),%eax
  add    %eax,%edx
  mov    -0x58(%rbp),%rax
  add    $0xc,%rax
  sar    $0xc,%edx
  mov    %edx,(%rax)
  mov    -0x20(%rbp),%eax
  sub    -0x10(%rbp),%eax
  mov    %eax,%edx
  mov    -0x58(%rbp),%rax
  add    $0x10,%rax
  sar    $0xc,%edx
  mov    %edx,(%rax)
  mov    -0x24(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,%edx
  mov    -0x58(%rbp),%rax
  add    $0x14,%rax
  sar    $0xc,%edx
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%eax
  sub    -0xc(%rbp),%eax
  mov    %eax,%edx
  mov    -0x58(%rbp),%rax
  add    $0x18,%rax
  sar    $0xc,%edx
  mov    %edx,(%rax)
  mov    -0x2c(%rbp),%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,%edx
  mov    -0x58(%rbp),%rax
  add    $0x1c,%rax
  sar    $0xc,%edx
  mov    %edx,(%rax)
L15:
  leave
  ret
```

assistant: ```c
void idct_row(int16_t *const block) {
  int d0, d1, d2, d3;
  int a0, a1, a2, a3, b0, b1, b2, b3;
  int t0, t1, t2, t3;
  if (__builtin_expect((!(block[1] | ((int32_t *)block)[1] | ((int32_t *)block)[2] | ((int32_t *)block)[3])) != 0, 1)) {
    uint32_t tmp = (uint16_t)(block[0] >> 1);
    tmp |= tmp << 16;
    ((int32_t *)block)[0] = tmp;
    ((int32_t *)block)[1] = tmp;
    ((int32_t *)block)[2] = tmp;
    ((int32_t *)block)[3] = tmp;
    return;
  }
  d0 = (block[0] << 11) + 2048;
  d1 = block[1];
  d2 = block[2] << 11;
  d3 = block[3];
  t0 = d0 + d2;
  t1 = d0 - d2;
  do {
    int tmp = 1108 * (d3 + d1);
    t2 = tmp + (2676 - 1108) * d1;
    t3 = tmp - (2676 + 1108) * d3;
  } while (0);
  a0 = t0 + t2;
  a1 = t1 + t3;
  a2 = t1 - t3;
  a3 = t0 - t2;
  d0 = block[4];
  d1 = block[5];
  d2 = block[6];
  d3 = block[7];
  do {
    int tmp = 565 * (d3 + d0);
    t0 = tmp + (2841 - 565) * d0;
    t1 = tmp - (2841 + 565) * d3;
  } while (0);
  do {
    int tmp = 2408 * (d1 + d2);
    t2 = tmp + (1609 - 2408) * d2;
    t3 = tmp - (1609 + 2408) * d1;
  } while (0);
  b0 = t0 + t2;
  b3 = t1 + t3;
  t0 -= t2;
  t1 -= t3;
  b1 = ((t0 + t1) >> 8) * 181;
  b2 = ((t0 - t1) >> 8) * 181;
  block[0] = (a0 + b0) >> 12;
  block[1] = (a1 + b1) >> 12;
  block[2] = (a2 + b2) >> 12;
  block[3] = (a3 + b3) >> 12;
  block[4] = (a3 - b3) >> 12;
  block[5] = (a2 - b2) >> 12;
  block[6] = (a1 - b1) >> 12;
  block[7] = (a0 - b0) >> 12;
}
```