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

```asm
<sony_decrypt>:
  endbr64
  push   %r13
  mov    %esi,%r13d
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x8,%rsp
  test   %edx,%edx
  je     L53
  imul   $0x2e90edd,%ecx,%ecx
  lea    D111(%rip),%r12
  lea    0x1(%rcx),%eax
  imul   $0x2e90edd,%eax,%ecx
  mov    %eax,%edi
  movd   %eax,%xmm0
  mov    %r12,%rax
  add    $0x1,%ecx
  imul   $0x2e90edd,%ecx,%edx
  movd   %ecx,%xmm3
  punpckldq %xmm3,%xmm0
  add    $0x1,%edx
  imul   $0x2e90edd,%edx,%esi
  xor    %edx,%edi
  movd   %edx,%xmm1
  shr    $0x1f,%edi
  lea    0x2(%rsi,%rsi,1),%esi
  or     %edi,%esi
  mov    $0x4,%edi
  movd   %esi,%xmm2
  punpckldq %xmm2,%xmm1
  punpcklqdq %xmm1,%xmm0
  movaps %xmm0,D44(%rip)
L62:
  mov    (%rax),%r8d
  xor    %esi,%ecx
  add    $0x3,%edi
  add    $0xc,%rax
  shr    $0x1f,%ecx
  xor    %edx,%r8d
  add    %r8d,%r8d
  or     %r8d,%ecx
  mov    -0x8(%rax),%r8d
  xor    %ecx,%edx
  mov    %ecx,0x4(%rax)
  xor    %esi,%r8d
  shr    $0x1f,%edx
  add    %r8d,%r8d
  or     %r8d,%edx
  mov    -0x4(%rax),%r8d
  xor    %edx,%esi
  mov    %edx,0x8(%rax)
  xor    %ecx,%r8d
  shr    $0x1f,%esi
  add    %r8d,%r8d
  or     %r8d,%esi
  mov    %esi,0xc(%rax)
  cmp    $0x7c,%edi
  jne    L62
  mov    D44(%rip),%eax
  mov    D145(%rip),%ecx
  movl   $0x0,D39(%rip)
  mov    D144(%rip),%edx
  mov    D70(%rip),%esi
  xor    %eax,%ecx
  xor    %edx,%esi
  mov    %ecx,%edi
  add    %ecx,%ecx
  add    %esi,%esi
  shr    $0x1f,%edi
  or     %edi,%esi
  xor    %esi,%edx
  mov    %esi,D2(%rip)
  mov    %edx,%esi
  add    %edx,%edx
  shr    $0x1f,%esi
  or     %esi,%ecx
  xor    %ecx,%eax
  mov    %ecx,D92(%rip)
  shr    $0x1f,%eax
  or     %edx,%eax
  mov    %eax,D136(%rip)
  xor    %eax,%eax
  nopl   (%rax)
L16:
  mov    %eax,%ebp
  mov    (%r12,%rbp,4),%edi
  call   <htonl@plt>
  mov    %eax,(%r12,%rbp,4)
  mov    D39(%rip),%eax
  add    $0x1,%eax
  mov    %eax,D16(%rip)
  cmp    $0x7e,%eax
  jbe    L16
L53:
  test   %r13d,%r13d
  je     L55
  mov    D16(%rip),%eax
  mov    %r13d,%r13d
  lea    D44(%rip),%rsi
  lea    (%rbx,%r13,4),%r8
  add    $0x1,%eax
  jmp    L0
  nopl   0x0(%rax)
L7:
  lea    0x40(%rax),%edx
  mov    %eax,%edi
  and    $0x7f,%ecx
  add    $0x4,%rbx
  and    $0x7f,%edx
  and    $0x7f,%edi
  mov    (%rsi,%rdx,4),%edx
  xor    (%rsi,%rdi,4),%edx
  mov    %edx,(%rsi,%rcx,4)
  xor    %edx,-0x4(%rbx)
  lea    0x1(%rax),%edx
  cmp    %rbx,%r8
  je     L40
  mov    %edx,%eax
L0:
  lea    -0x1(%rax),%ecx
  cmp    $0x1,%eax
  jne    L7
  movl   $0x1,D16(%rip)
L55:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   (%rax)
L40:
  mov    %eax,D16(%rip)
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

assistant: ```c
void sony_decrypt(unsigned *data, int len, int start, int key) {
  static unsigned pad[128], p;
  if (start) {
    for (p = 0; p < 4; p++)
      pad[p] = key = key * 48828125 + 1;
    pad[3] = pad[3] << 1 | (pad[0] ^ pad[2]) >> 31;
    for (p = 4; p < 127; p++)
      pad[p] = (pad[p - 4] ^ pad[p - 2]) << 1 | (pad[p - 3] ^ pad[p - 1]) >> 31;
    for (p = 0; p < 127; p++)
      pad[p] = htonl(pad[p]);
  }
  while (len-- && p++)
    *data++ ^= pad[(p - 1) & 127] = pad[p & 127] ^ pad[(p + 64) & 127];
}
```