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

```asm
<update>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %ecx,-0x2c(%rbp)
  mov    %r8d,-0x30(%rbp)
  movss  D8(%rip),%xmm0
  movss  %xmm0,-0x4(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  je     L52
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x8(%rbp)
  movl   $0x1,-0x10(%rbp)
  jmp    L80
L74:
  movl   $0x1,-0xc(%rbp)
  jmp    L97
L55:
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    -0x10(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  addss  %xmm0,%xmm1
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  sub    $0x4,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  addss  %xmm0,%xmm1
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  add    $0x1,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <fabsf@plt>
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  mov    %edx,%edi
  movd   %eax,%xmm0
  call   <fmaxf@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x8(%rbp)
  addl   $0x1,-0xc(%rbp)
L97:
  mov    -0x30(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jge    L55
  addl   $0x1,-0x10(%rbp)
L80:
  mov    -0x2c(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jge    L74
  mov    -0x28(%rbp),%rax
  movss  -0x8(%rbp),%xmm0
  movss  %xmm0,(%rax)
  jmp    L24
L52:
  movl   $0x1,-0x10(%rbp)
  jmp    L23
L0:
  movl   $0x1,-0xc(%rbp)
  jmp    L41
L37:
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    -0x10(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  addss  %xmm0,%xmm1
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  sub    $0x4,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  addss  %xmm0,%xmm1
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  add    $0x1,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0xc(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  mulss  -0x4(%rbp),%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,-0xc(%rbp)
L41:
  mov    -0x30(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jge    L37
  addl   $0x1,-0x10(%rbp)
L23:
  mov    -0x2c(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jge    L0
L24:
  nop
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D8
type_guessed: f32

tool: D8: 0.25

assistant: ```c
void update(float **newarr, float **oldarr, float *norm, int nx, int ny) {
  int i, j;
  const float factor = 0.25;
  float lnorm;
  if (norm != NULL) {
    lnorm = 0;
#pragma acc parallel loop reduction(max : lnorm) private(i, j) present(newarr, oldarr) collapse(2)
    for (i = 1; i < nx + 1; i++) {
      for (j = 1; j < ny + 1; j++) {
        newarr[i][j] = factor * (oldarr[i - 1][j] + oldarr[i + 1][j] + oldarr[i][j - 1] + oldarr[i][j + 1]);
        lnorm = fmaxf(lnorm, fabsf(newarr[i][j] - oldarr[i][j]));
      }
    }
    *norm = lnorm;
  } else {
#pragma acc parallel loop private(i, j) present(newarr, oldarr) collapse(2)
    for (i = 1; i < nx + 1; i++) {
      for (j = 1; j < ny + 1; j++) {
        newarr[i][j] = factor * (oldarr[i - 1][j] + oldarr[i + 1][j] + oldarr[i][j - 1] + oldarr[i][j + 1]);
      }
    }
  }
}
```