user: Please show me the C implementation that matches the assembly code listed below:

```asm
<SOR_execute>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x44(%rbp)
  mov    %esi,-0x48(%rbp)
  movsd  %xmm0,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %ecx,-0x5c(%rbp)
  movsd  -0x50(%rbp),%xmm1
  movsd  D18(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D14(%rip),%xmm0
  subsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  mov    -0x44(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x48(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x2c(%rbp)
  movl   $0x0,-0x3c(%rbp)
  jmp    L47
L23:
  movl   $0x1,-0x38(%rbp)
  jmp    L25
L26:
  mov    -0x38(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x38(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x38(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  movl   $0x1,-0x34(%rbp)
  jmp    L28
L38:
  mov    -0x34(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x34(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x34(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm0,%xmm1
  mov    -0x34(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x28(%rbp),%xmm1
  mov    -0x34(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x34(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x34(%rbp)
L28:
  mov    -0x34(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  jl     L38
  addl   $0x1,-0x38(%rbp)
L25:
  mov    -0x38(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jl     L26
  addl   $0x1,-0x3c(%rbp)
L47:
  mov    -0x3c(%rbp),%eax
  cmp    -0x5c(%rbp),%eax
  jl     L23
  nop
  nop
  pop    %rbp
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D18
datatype: f64
name: unpack_data
arguments: data_tag: D14
datatype: f64

tool: D18: 0.25

tool: D14: 1

assistant: ```c
void SOR_execute(int M, int N, double omega, double **G, int num_iterations) {
  double omega_over_four = omega * 0.25;
  double one_minus_omega = 1.0 - omega;
  int Mm1 = M - 1;
  int Nm1 = N - 1;
  int p;
  int i;
  int j;
  double *Gi;
  double *Gim1;
  double *Gip1;
  for (p = 0; p < num_iterations; p++) {
    for (i = 1; i < Mm1; i++) {
      Gi = G[i];
      Gim1 = G[i - 1];
      Gip1 = G[i + 1];
      for (j = 1; j < Nm1; j++)
        Gi[j] = omega_over_four * (Gim1[j] + Gip1[j] + Gi[j - 1] + Gi[j + 1]) + one_minus_omega * Gi[j];
    }
  }
}
```