user: 请从给定的汇编指令推导出C源代码：

```asm
<asg_pstep3d>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,-0x10(%rsp)
  mov    %rsi,-0x30(%rsp)
  mov    %rdx,-0x28(%rsp)
  mov    %rcx,-0x20(%rsp)
  mov    %r8,-0x50(%rsp)
  mov    %r9,-0x48(%rsp)
  mov    0x50(%rsp),%rdi
  mov    0x60(%rsp),%r13
  mov    0x80(%rsp),%r14
  mov    0x58(%rsp),%rax
  mov    0x8(%rax),%eax
  cmp    0x8(%r13),%eax
  jg     L484
  movslq %eax,%r15
  lea    0x4(%rdi),%rax
  mov    %rax,-0x8(%rsp)
  mov    %r14,%r13
  jmp    L526
L224:
  mov    0x0(%r13),%rax
  movss  (%rax,%rbp,1),%xmm4
  mov    -0x50(%rsp),%rax
  mov    (%rax,%r15,8),%rax
  mov    (%rax,%r14,1),%rdx
  mov    0x8(%r13),%rax
  movss  (%rax,%rbp,1),%xmm3
  mov    -0x48(%rsp),%rax
  mov    (%rax,%r15,8),%rsi
  mov    -0x54(%rsp),%r9d
  lea    (%rbx,%r9,1),%eax
  cltq
  mov    (%rsi,%rax,8),%r11
  mov    %r9d,%eax
  sub    %ebx,%eax
  cltq
  mov    -0x8(%rsi,%rax,8),%r10
  mov    0x10(%r13),%rax
  movss  (%rax,%rbp,1),%xmm2
  lea    (%rbx,%r15,1),%eax
  cltq
  mov    0x38(%rsp),%rsi
  mov    (%rsi,%rax,8),%rax
  mov    (%rax,%r14,1),%r9
  mov    %r15d,%eax
  sub    %ebx,%eax
  cltq
  mov    -0x8(%rsi,%rax,8),%rax
  mov    (%rax,%r14,1),%r8
  movslq -0x60(%rsp),%rax
  lea    (%rdx,%rbp,1),%rsi
  add    %r12,%rdx
L534:
  movss  (%rsi,%rax,4),%xmm0
  subss  -0x4(%rdx,%rax,4),%xmm0
  mulss  %xmm4,%xmm0
  movss  (%r11,%rax,4),%xmm1
  subss  (%r10,%rax,4),%xmm1
  mulss  %xmm3,%xmm1
  addss  %xmm1,%xmm0
  movss  (%r9,%rax,4),%xmm1
  subss  (%r8,%rax,4),%xmm1
  mulss  %xmm2,%xmm1
  addss  %xmm1,%xmm0
  addss  (%rdi,%rax,4),%xmm0
  movss  %xmm0,(%rdi,%rax,4)
  add    $0x1,%rax
  cmp    %eax,%ecx
  jge    L534
L216:
  add    $0x1,%ebx
  add    $0x4,%rbp
  sub    $0x4,%r12
  cmp    %ebx,0x78(%rsp)
  je     L417
L158:
  cmp    %ecx,-0x60(%rsp)
  jle    L224
  jmp    L216
L417:
  cmp    %ecx,-0x60(%rsp)
  jg     L479
L374:
  mov    -0x40(%rsp),%rax
  lea    (%rax,%rax,1),%r8
  mov    -0x30(%rsp),%rbx
  mov    %r8,%rdx
  add    (%rbx,%r15,8),%rdx
  mov    0x40(%rsp),%rbx
  mov    (%rbx),%r14
  mov    -0x10(%rsp),%rbx
  mov    %r8,%rcx
  add    (%rbx,%r15,8),%rcx
  mov    0x48(%rsp),%rbx
  mov    (%rbx),%r12
  mov    -0x28(%rsp),%rbx
  mov    %r8,%rbp
  add    (%rbx,%r15,8),%rbp
  mov    0x40(%rsp),%rsi
  mov    %rax,%rbx
  add    0x8(%rsi),%rbx
  mov    0x48(%rsp),%rsi
  add    0x8(%rsi),%rax
  mov    %rax,%r11
  mov    -0x20(%rsp),%rax
  add    (%rax,%r15,8),%r8
  mov    0x40(%rsp),%rsi
  mov    -0x18(%rsp),%rax
  mov    %rax,%r10
  add    0x10(%rsi),%r10
  mov    0x48(%rsp),%rsi
  add    0x10(%rsi),%rax
  mov    %rax,%r9
  movslq -0x60(%rsp),%rax
  mov    %r8,-0x60(%rsp)
  mov    %r15,-0x38(%rsp)
  mov    0x60(%rsp),%r15
  mov    %r13,0x80(%rsp)
  mov    %rdx,%r13
L41:
  lea    0x0(,%rax,4),%rdx
  mov    %rdx,%rsi
  add    0x0(%r13),%rsi
  movss  (%rdi,%rax,4),%xmm1
  movss  (%rsi),%xmm0
  mulss  (%r14,%rax,4),%xmm0
  mov    (%rcx),%r8
  movaps %xmm1,%xmm2
  mulss  (%r8,%rax,4),%xmm2
  subss  %xmm2,%xmm0
  mulss  (%r12,%rax,4),%xmm0
  movss  %xmm0,(%rsi)
  mov    %rdx,%rsi
  add    0x0(%rbp),%rsi
  movss  (%rsi),%xmm0
  mulss  (%rbx),%xmm0
  mov    (%rcx),%r8
  movaps %xmm1,%xmm2
  mulss  (%r8,%rax,4),%xmm2
  subss  %xmm2,%xmm0
  mulss  (%r11),%xmm0
  movss  %xmm0,(%rsi)
  mov    -0x60(%rsp),%rsi
  add    (%rsi),%rdx
  movss  (%rdx),%xmm0
  mulss  (%r10),%xmm0
  mov    (%rcx),%rsi
  mulss  (%rsi,%rax,4),%xmm1
  subss  %xmm1,%xmm0
  mulss  (%r9),%xmm0
  movss  %xmm0,(%rdx)
  add    $0x1,%rax
  cmp    %eax,(%r15)
  jge    L41
  mov    -0x38(%rsp),%r15
  mov    0x80(%rsp),%r13
L479:
  addl   $0x1,-0x54(%rsp)
  mov    -0x54(%rsp),%eax
  addq   $0x4,-0x40(%rsp)
  mov    0x60(%rsp),%rbx
  cmp    %eax,0x4(%rbx)
  jl     L226
L159:
  mov    0x58(%rsp),%rax
  mov    (%rax),%ebx
  mov    %ebx,-0x60(%rsp)
  mov    0x60(%rsp),%rax
  mov    (%rax),%ecx
  cmp    %ecx,%ebx
  jg     L169
  movslq %ebx,%rsi
  lea    (%rdi,%rsi,4),%rax
  mov    %ecx,%edx
  sub    %ebx,%edx
  add    %rsi,%rdx
  mov    -0x8(%rsp),%rbx
  lea    (%rbx,%rdx,4),%rdx
L377:
  movl   $0x0,(%rax)
  add    $0x4,%rax
  cmp    %rdx,%rax
  jne    L377
  cmpl   $0x0,0x78(%rsp)
  jle    L374
L321:
  mov    -0x40(%rsp),%rax
  lea    (%rax,%rax,1),%r14
  mov    $0x0,%r12d
  mov    $0x0,%ebp
  mov    $0x0,%ebx
  jmp    L158
L226:
  add    $0x1,%r15
  mov    0x60(%rsp),%rax
  cmp    %r15d,0x8(%rax)
  jl     L28
L526:
  mov    0x58(%rsp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x54(%rsp)
  mov    0x60(%rsp),%rbx
  cmp    0x4(%rbx),%eax
  jg     L226
  lea    0x0(,%r15,4),%rbx
  mov    %rbx,-0x18(%rsp)
  cltq
  shl    $0x2,%rax
  mov    %rax,-0x40(%rsp)
  jmp    L159
L28:
  mov    %rax,%r13
L484:
  mov    0x68(%rsp),%rax
  cmpl   $0x0,(%rax)
  je     L160
  mov    0x58(%rsp),%rax
  mov    0x8(%rax),%r10d
  cmp    0x8(%r13),%r10d
  jg     L542
  movslq %r10d,%r10
  movss  D32(%rip),%xmm1
  mov    -0x30(%rsp),%rbp
  mov    %rax,%rdi
  mov    0x78(%rsp),%r8d
L62:
  mov    0x4(%rdi),%ebx
  cmp    0x4(%r13),%ebx
  jg     L376
  movslq %ebx,%rax
  mov    0x0(%rbp,%r10,8),%rdx
  lea    (%rdx,%rax,8),%r11
L555:
  mov    %r11,%r9
  movslq (%rdi),%rdx
  mov    (%r11),%rax
  movl   $0x0,-0x4(%rax,%rdx,4)
  cmp    $0x1,%r8d
  jle    L531
  mov    $0x1,%edx
L440:
  mov    (%r9),%rsi
  mov    (%rdi),%eax
  mov    %eax,%ecx
  sub    %edx,%ecx
  movslq %ecx,%rcx
  add    %edx,%eax
  cltq
  movss  -0x4(%rsi,%rax,4),%xmm0
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x4(%rsi,%rcx,4)
  add    $0x1,%edx
  cmp    %edx,%r8d
  jne    L440
L531:
  add    $0x1,%ebx
  add    $0x8,%r11
  cmp    %ebx,0x4(%r13)
  jge    L555
L376:
  add    $0x1,%r10
  cmp    %r10d,0x8(%r13)
  jge    L62
L160:
  mov    0x70(%rsp),%rax
  cmpl   $0x0,(%rax)
  je     L545
  mov    0x58(%rsp),%rax
  mov    0x8(%rax),%r10d
  cmp    0x8(%r13),%r10d
  jg     L542
  movslq %r10d,%r10
  movss  D32(%rip),%xmm1
  mov    -0x30(%rsp),%rbx
  mov    0x78(%rsp),%edi
L46:
  mov    0x58(%rsp),%rax
  mov    0x4(%rax),%r11d
  cmp    0x4(%r13),%r11d
  jg     L538
  movslq %r11d,%rax
  mov    (%rbx,%r10,8),%rdx
  lea    (%rdx,%rax,8),%r9
L435:
  mov    %r9,%r8
  movslq 0x0(%r13),%rdx
  mov    (%r9),%rax
  movl   $0x0,0x4(%rax,%rdx,4)
  cmp    $0x1,%edi
  jle    L471
  mov    $0x1,%edx
L99:
  mov    (%r8),%rsi
  mov    0x0(%r13),%eax
  lea    (%rax,%rdx,1),%ecx
  movslq %ecx,%rcx
  sub    %edx,%eax
  cltq
  movss  0x4(%rsi,%rax,4),%xmm0
  xorps  %xmm1,%xmm0
  movss  %xmm0,0x4(%rsi,%rcx,4)
  add    $0x1,%edx
  cmp    %edx,%edi
  jne    L99
L471:
  add    $0x1,%r11d
  add    $0x8,%r9
  cmp    %r11d,0x4(%r13)
  jge    L435
L538:
  add    $0x1,%r10
  cmp    %r10d,0x8(%r13)
  jge    L46
L545:
  mov    0x68(%rsp),%rax
  cmpl   $0x0,0x4(%rax)
  je     L123
  mov    0x58(%rsp),%rax
  mov    0x8(%rax),%r9d
  cmp    0x8(%r13),%r9d
  jg     L120
  movslq %r9d,%r9
  movss  D32(%rip),%xmm1
  mov    %rax,%r8
  mov    0x78(%rsp),%r10d
L48:
  mov    (%r8),%r11d
  mov    -0x28(%rsp),%rax
  mov    (%rax,%r9,8),%rdi
  movslq %r11d,%rsi
  shl    $0x2,%rsi
L139:
  movslq 0x4(%r8),%rax
  mov    -0x8(%rdi,%rax,8),%rax
  movl   $0x0,(%rax,%rsi,1)
  cmp    $0x1,%r10d
  jle    L567
  mov    $0x1,%edx
L343:
  mov    0x4(%r8),%eax
  mov    %eax,%ecx
  sub    %edx,%ecx
  movslq %ecx,%rcx
  mov    -0x8(%rdi,%rcx,8),%rcx
  add    %edx,%eax
  cltq
  mov    -0x8(%rdi,%rax,8),%rax
  movss  (%rax,%rsi,1),%xmm0
  xorps  %xmm1,%xmm0
  movss  %xmm0,(%rcx,%rsi,1)
  add    $0x1,%edx
  cmp    %edx,%r10d
  jne    L343
L567:
  add    $0x1,%r11d
  add    $0x4,%rsi
  cmp    %r11d,(%r8)
  jge    L139
  add    $0x1,%r9
  cmp    %r9d,0x8(%r13)
  jge    L48
L123:
  mov    0x70(%rsp),%rax
  cmpl   $0x0,0x4(%rax)
  je     L120
  mov    0x58(%rsp),%rax
  mov    0x8(%rax),%r9d
  cmp    0x8(%r13),%r9d
  jg     L120
  movslq %r9d,%r9
  movss  D32(%rip),%xmm1
  mov    %rax,%r11
  mov    0x78(%rsp),%r8d
L221:
  mov    (%r11),%r10d
  mov    -0x28(%rsp),%rax
  mov    (%rax,%r9,8),%rdi
  movslq %r10d,%rsi
  shl    $0x2,%rsi
L504:
  movslq 0x4(%r13),%rax
  mov    0x8(%rdi,%rax,8),%rax
  movl   $0x0,(%rax,%rsi,1)
  cmp    $0x1,%r8d
  jle    L81
  mov    $0x1,%edx
L501:
  mov    0x4(%r13),%eax
  lea    (%rax,%rdx,1),%ecx
  movslq %ecx,%rcx
  mov    0x8(%rdi,%rcx,8),%rcx
  sub    %edx,%eax
  cltq
  mov    0x8(%rdi,%rax,8),%rax
  movss  (%rax,%rsi,1),%xmm0
  xorps  %xmm1,%xmm0
  movss  %xmm0,(%rcx,%rsi,1)
  add    $0x1,%edx
  cmp    %edx,%r8d
  jne    L501
L81:
  add    $0x1,%r10d
  add    $0x4,%rsi
  cmp    %r10d,(%r11)
  jge    L504
  add    $0x1,%r9
  cmp    %r9d,0x8(%r13)
  jge    L221
L120:
  mov    0x68(%rsp),%rax
  cmpl   $0x0,0x8(%rax)
  je     L307
  mov    0x58(%rsp),%rax
  mov    0x4(%rax),%r9d
  cmp    0x4(%r13),%r9d
  jg     L106
  movslq %r9d,%rsi
  shl    $0x3,%rsi
  movss  D32(%rip),%xmm1
  mov    -0x20(%rsp),%r8
  mov    %rax,%r10
  mov    0x78(%rsp),%r11d
L58:
  mov    (%r10),%ebx
  movslq %ebx,%rdi
  shl    $0x2,%rdi
L202:
  movslq 0x8(%r10),%rax
  mov    -0x8(%r8,%rax,8),%rax
  mov    (%rax,%rsi,1),%rax
  movl   $0x0,(%rax,%rdi,1)
  cmp    $0x1,%r11d
  jle    L108
  mov    $0x1,%edx
L203:
  mov    0x8(%r10),%eax
  mov    %eax,%ecx
  sub    %edx,%ecx
  movslq %ecx,%rcx
  mov    -0x8(%r8,%rcx,8),%rcx
  mov    (%rcx,%rsi,1),%rcx
  add    %edx,%eax
  cltq
  mov    -0x8(%r8,%rax,8),%rax
  mov    (%rax,%rsi,1),%rax
  movss  (%rax,%rdi,1),%xmm0
  xorps  %xmm1,%xmm0
  movss  %xmm0,(%rcx,%rdi,1)
  add    $0x1,%edx
  cmp    %edx,%r11d
  jne    L203
L108:
  add    $0x1,%ebx
  add    $0x4,%rdi
  cmp    %ebx,(%r10)
  jge    L202
  add    $0x1,%r9d
  add    $0x8,%rsi
  cmp    %r9d,0x4(%r13)
  jge    L58
L307:
  mov    0x70(%rsp),%rax
  cmpl   $0x0,0x8(%rax)
  je     L106
  mov    0x58(%rsp),%rax
  mov    0x4(%rax),%r9d
  cmp    0x4(%r13),%r9d
  jg     L106
  movslq %r9d,%rdi
  shl    $0x3,%rdi
  movss  D32(%rip),%xmm1
  mov    -0x20(%rsp),%r8
  mov    %rax,%rbx
  mov    0x78(%rsp),%r10d
L229:
  mov    (%rbx),%r11d
  movslq %r11d,%rsi
  shl    $0x2,%rsi
L486:
  movslq 0x8(%r13),%rax
  mov    0x8(%r8,%rax,8),%rax
  mov    (%rax,%rdi,1),%rax
  movl   $0x0,(%rax,%rsi,1)
  cmp    $0x1,%r10d
  jle    L318
  mov    $0x1,%edx
L427:
  mov    0x8(%r13),%eax
  lea    (%rax,%rdx,1),%ecx
  movslq %ecx,%rcx
  mov    0x8(%r8,%rcx,8),%rcx
  mov    (%rcx,%rdi,1),%rcx
  sub    %edx,%eax
  cltq
  mov    0x8(%r8,%rax,8),%rax
  mov    (%rax,%rdi,1),%rax
  movss  (%rax,%rsi,1),%xmm0
  xorps  %xmm1,%xmm0
  movss  %xmm0,(%rcx,%rsi,1)
  add    $0x1,%edx
  cmp    %edx,%r10d
  jne    L427
L318:
  add    $0x1,%r11d
  add    $0x4,%rsi
  cmp    %r11d,(%rbx)
  jge    L486
  add    $0x1,%r9d
  add    $0x8,%rdi
  cmp    %r9d,0x4(%r13)
  jge    L229
L106:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L542:
  mov    0x68(%rsp),%rax
  cmpl   $0x0,0x4(%rax)
  jne    L120
  jmp    L123
L169:
  cmpl   $0x0,0x78(%rsp)
  jg     L321
  jmp    L479
```

tool_calls: name: read_data
arguments: data_label: D32
type_guessed: byte[4]

tool: {"D32": [0x00,0x00,0x00,0x80]}

assistant: ```c
void asg_pstep3d(float ***restrict bulk, float ***restrict p0, float ***restrict p1, float ***restrict p2, float ***restrict v0, float ***restrict v1, float ***restrict v2, float **restrict ep, float **restrict epp, float *restrict sdiv, int *gsc, int *gec, int *lbc, int *rbc, int maxoff, float **restrict c) {
  int i0, i1, i2;
  int ioff;
  for (i2 = gsc[2]; i2 <= gec[2]; i2++) {
    for (i1 = gsc[1]; i1 <= gec[1]; i1++) {
      for (i0 = gsc[0]; i0 <= gec[0]; i0++)
        sdiv[i0] = 0.0f;
      for (ioff = 0; ioff < maxoff; ioff++) {
        for (i0 = gsc[0]; i0 <= gec[0]; i0++) {
          sdiv[i0] += (c[0][ioff] * (v0[i2][i1][i0 + ioff] - v0[i2][i1][i0 - ioff - 1]) + c[1][ioff] * (v1[i2][i1 + ioff][i0] - v1[i2][i1 - ioff - 1][i0]) + c[2][ioff] * (v2[i2 + ioff][i1][i0] - v2[i2 - ioff - 1][i1][i0]));
        }
      }
      for (i0 = gsc[0]; i0 <= gec[0]; i0++) {
        p0[i2][i1][i0] = (p0[i2][i1][i0] * ep[0][i0] - bulk[i2][i1][i0] * sdiv[i0]) * epp[0][i0];
        p1[i2][i1][i0] = (p1[i2][i1][i0] * ep[1][i1] - bulk[i2][i1][i0] * sdiv[i0]) * epp[1][i1];
        p2[i2][i1][i0] = (p2[i2][i1][i0] * ep[2][i2] - bulk[i2][i1][i0] * sdiv[i0]) * epp[2][i2];
      }
    }
  }
  if (lbc[0]) {
    for (i2 = gsc[2]; i2 <= gec[2]; i2++) {
      for (i1 = gsc[1]; i1 <= gec[1]; i1++) {
        p0[i2][i1][gsc[0] - 1] = 0.0f;
        for (ioff = 1; ioff < maxoff; ioff++) {
          p0[i2][i1][gsc[0] - ioff - 1] = -p0[i2][i1][gsc[0] + ioff - 1];
        }
      }
    }
  }
  if (rbc[0]) {
    for (i2 = gsc[2]; i2 <= gec[2]; i2++) {
      for (i1 = gsc[1]; i1 <= gec[1]; i1++) {
        p0[i2][i1][gec[0] + 1] = 0.0f;
        for (ioff = 1; ioff < maxoff; ioff++) {
          p0[i2][i1][gec[0] + ioff + 1] = -p0[i2][i1][gec[0] - ioff + 1];
        }
      }
    }
  }
  if (lbc[1]) {
    for (i2 = gsc[2]; i2 <= gec[2]; i2++) {
      for (i0 = gsc[0]; i0 <= gsc[0]; i0++) {
        p1[i2][gsc[1] - 1][i0] = 0.0f;
        for (ioff = 1; ioff < maxoff; ioff++) {
          p1[i2][gsc[1] - ioff - 1][i0] = -p1[i2][gsc[1] + ioff - 1][i0];
        }
      }
    }
  }
  if (rbc[1]) {
    for (i2 = gsc[2]; i2 <= gec[2]; i2++) {
      for (i0 = gsc[0]; i0 <= gsc[0]; i0++) {
        p1[i2][gec[1] + 1][i0] = 0.0f;
        for (ioff = 1; ioff < maxoff; ioff++) {
          p1[i2][gec[1] + ioff + 1][i0] = -p1[i2][gec[1] - ioff + 1][i0];
        }
      }
    }
  }
  if (lbc[2]) {
    for (i1 = gsc[1]; i1 <= gec[1]; i1++) {
      for (i0 = gsc[0]; i0 <= gsc[0]; i0++) {
        p2[gsc[2] - 1][i1][i0] = 0.0f;
        for (ioff = 1; ioff < maxoff; ioff++) {
          p2[gsc[2] - ioff - 1][i1][i0] = -p2[gsc[2] + ioff - 1][i1][i0];
        }
      }
    }
  }
  if (rbc[2]) {
    for (i1 = gsc[1]; i1 <= gec[1]; i1++) {
      for (i0 = gsc[0]; i0 <= gsc[0]; i0++) {
        p2[gec[2] + 1][i1][i0] = 0.0f;
        for (ioff = 1; ioff < maxoff; ioff++) {
          p2[gec[2] + ioff + 1][i1][i0] = -p2[gec[2] - ioff + 1][i1][i0];
        }
      }
    }
  }
}
```