user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<nullspace>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  movslq %edx,%r13
  push   %r12
  lea    (%rcx,%r13,4),%r15
  push   %rbp
  push   %rbx
  mov    %rcx,-0x8(%rsp)
  mov    %r15,-0x10(%rsp)
  test   %r13d,%r13d
  jle    L147
  mov    %rsi,-0x18(%rsp)
  mov    %rdi,%rbx
  mov    %rcx,%r14
  mov    %r13,%rax
  movl   $0x0,-0x1c(%rsp)
  movq   D29(%rip),%xmm3
  lea    0x0(,%r13,8),%rcx
  xor    %edi,%edi
  movsd  D1(%rip),%xmm5
  movq   D46(%rip),%xmm4
  xor    %r10d,%r10d
  nopl   0x0(%rax,%rax,1)
L148:
  mov    %eax,%r9d
  lea    0x1(%r10),%r11d
  mov    %edi,%r12d
  imul   %r10d,%r9d
  lea    (%r9,%rdi,1),%edx
  movslq %edx,%rdx
  lea    (%rbx,%rdx,8),%rbp
  movsd  0x0(%rbp),%xmm2
  movapd %xmm2,%xmm1
  andpd  %xmm3,%xmm1
  cmp    %r11d,%eax
  jle    L206
  lea    (%r9,%rax,1),%edx
  mov    %r10d,%r8d
  movslq %edx,%rdx
  add    %rdi,%rdx
  lea    (%rbx,%rdx,8),%rsi
  mov    %r11d,%edx
  nopl   0x0(%rax,%rax,1)
L238:
  movsd  (%rsi),%xmm0
  andpd  %xmm3,%xmm0
  comisd %xmm1,%xmm0
  maxsd  %xmm1,%xmm0
  cmova  %edx,%r8d
  add    $0x1,%edx
  movapd %xmm0,%xmm1
  add    %rcx,%rsi
  cmp    %edx,%eax
  jne    L238
L190:
  comisd %xmm1,%xmm5
  jbe    L75
  addl   $0x1,-0x1c(%rsp)
  lea    0x4(%r14),%r8
  mov    %r12d,(%r14)
  cmp    %r10d,%eax
  jle    L67
  movslq %r9d,%rdx
  add    %rdi,%rdx
  lea    (%rbx,%rdx,8),%rsi
  mov    %r10d,%edx
  nopw   0x0(%rax,%rax,1)
L0:
  add    $0x1,%edx
  movq   $0x0,(%rsi)
  add    %rcx,%rsi
  cmp    %edx,%eax
  jne    L0
L67:
  mov    %r8,%r14
L137:
  add    $0x1,%rdi
  cmp    %r13,%rdi
  jne    L148
  mov    -0x1c(%rsp),%edx
  mov    -0x18(%rsp),%r9
  test   %edx,%edx
  je     L129
  mov    -0x8(%rsp),%r10
  mov    %eax,%r12d
  mov    -0x10(%rsp),%r14
  xor    %r8d,%r8d
  sub    %edx,%r12d
  sub    $0x1,%edx
  movq   D46(%rip),%xmm2
  pxor   %xmm3,%xmm3
  lea    0x4(%r10),%rsi
  movsd  D5(%rip),%xmm1
  mov    %r10,%r13
  lea    (%rsi,%rdx,4),%r11
  lea    -0x1(%r12),%edx
  add    %rdi,%rdx
  lea    (%rsi,%rdx,4),%rbp
  nopl   0x0(%rax,%rax,1)
L213:
  mov    0x0(%r13),%edi
  test   %r12d,%r12d
  jle    L261
  movslq %edi,%rdx
  lea    (%rbx,%rdx,8),%r15
  mov    %r14,%rdx
  nopl   0x0(%rax,%rax,1)
L41:
  mov    (%rdx),%esi
  movsd  (%r15),%xmm0
  add    $0x4,%rdx
  add    %rcx,%r15
  add    %r8d,%esi
  xorpd  %xmm2,%xmm0
  movslq %esi,%rsi
  movsd  %xmm0,(%r9,%rsi,8)
  cmp    %rdx,%rbp
  jne    L41
L261:
  mov    %r10,%rsi
  cs nopw 0x0(%rax,%rax,1)
L203:
  mov    (%rsi),%edx
  movapd %xmm1,%xmm0
  cmp    %edi,%edx
  je     L19
  movapd %xmm3,%xmm0
L19:
  add    %r8d,%edx
  add    $0x4,%rsi
  movslq %edx,%rdx
  movsd  %xmm0,(%r9,%rdx,8)
  cmp    %rsi,%r11
  jne    L203
  add    $0x4,%r13
  add    %eax,%r8d
  cmp    %r13,%r11
  jne    L213
L129:
  mov    -0x1c(%rsp),%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L75:
  imul   %eax,%r8d
  mov    %r12d,(%r15)
  lea    0x4(%r15),%rdx
  movslq %r8d,%rsi
  lea    (%rbx,%rsi,8),%r12
  movslq %r9d,%rsi
  lea    (%rbx,%rsi,8),%r8
  mov    %rdi,%rsi
  jmp    L153
  xchg   %ax,%ax
L108:
  movsd  (%r8,%rsi,8),%xmm2
L153:
  movsd  (%r12,%rsi,8),%xmm0
  movsd  %xmm0,(%r8,%rsi,8)
  movsd  %xmm2,(%r12,%rsi,8)
  add    $0x1,%rsi
  cmp    %esi,%eax
  jg     L108
  movsd  0x0(%rbp),%xmm1
  mov    %rdi,%rsi
  movapd %xmm1,%xmm0
  jmp    L72
  xchg   %ax,%ax
L119:
  movsd  (%r8,%rsi,8),%xmm0
L72:
  divsd  %xmm1,%xmm0
  movsd  %xmm0,(%r8,%rsi,8)
  add    $0x1,%rsi
  cmp    %esi,%eax
  jg     L119
  mov    %rbx,%rbp
  xor    %r12d,%r12d
  test   %r10d,%r10d
  je     L192
  nopl   0x0(%rax,%rax,1)
L218:
  movsd  0x0(%rbp,%rdi,8),%xmm0
  mov    %rdi,%rsi
  movapd %xmm0,%xmm2
  xorpd  %xmm4,%xmm2
  jmp    L246
  nopl   0x0(%rax,%rax,1)
L262:
  movsd  0x0(%rbp,%rsi,8),%xmm0
L246:
  movsd  (%r8,%rsi,8),%xmm1
  mulsd  %xmm2,%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x0(%rbp,%rsi,8)
  add    $0x1,%rsi
  cmp    %esi,%eax
  jg     L262
  add    $0x1,%r12d
  add    %rcx,%rbp
  cmp    %r10d,%r12d
  jne    L218
L192:
  cmp    %r11d,%eax
  jle    L63
  lea    (%r9,%rax,1),%esi
  mov    %r11d,%r10d
  movslq %esi,%rsi
  lea    (%rbx,%rsi,8),%r9
  nopl   0x0(%rax)
L258:
  movsd  (%r9,%rdi,8),%xmm2
  mov    %rdi,%rsi
  movapd %xmm2,%xmm0
  jmp    L162
  nopw   0x0(%rax,%rax,1)
L204:
  movsd  (%r9,%rsi,8),%xmm0
L162:
  movsd  (%r8,%rsi,8),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%r9,%rsi,8)
  add    $0x1,%rsi
  cmp    %esi,%eax
  jg     L204
  add    $0x1,%r10d
  add    %rcx,%r9
  cmp    %r10d,%eax
  jne    L258
L63:
  mov    %r11d,%r10d
  mov    %rdx,%r15
  jmp    L137
L206:
  mov    %r10d,%r8d
  jmp    L190
L147:
  movl   $0x0,-0x1c(%rsp)
  mov    -0x1c(%rsp),%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D29
datatype: qword
name: extract_symbolic_data
arguments: label: D1
datatype: byte[8]
name: extract_symbolic_data
arguments: label: D46
datatype: byte[8]
name: extract_symbolic_data
arguments: label: D5
datatype: byte[8]

tool: D29: 9223372036854775807

tool: {"D1": [0x11,0xea,0x2d,0x81,0x99,0x97,0x71,0x3d]}

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

tool: {"D5": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

assistant: ```c
int nullspace(double *matrix, double *nullspace, int n, int *buffer) {
  int *pnopivot = buffer, nonpivot = 0;
  int *ppivot = buffer + n;
  int i, j, k, l, ptr, max;
  double pivot, t;
  double tol = 1e-12;
  ptr = 0;
  i = 0;
  for (j = 0; j < n; j++) {
    pivot = fabs(matrix[n * i + j]);
    max = i;
    for (k = i + 1; k < n; k++) {
      t = fabs(matrix[n * k + j]);
      if (pivot < t) {
        pivot = t;
        max = k;
      }
    }
    if (pivot < tol) {
      *(pnopivot++) = j;
      nonpivot++;
      for (k = i; k < n; k++)
        matrix[n * k + j] = 0;
    } else {
      *(ppivot++) = j;
      for (k = j; k < n; k++) {
        t = matrix[i * n + k];
        matrix[i * n + k] = matrix[max * n + k];
        matrix[max * n + k] = t;
      }
      pivot = matrix[i * n + j];
      for (k = j; k < n; k++)
        matrix[i * n + k] /= pivot;
      for (k = 0; k < i; k++) {
        pivot = -matrix[k * n + j];
        for (l = j; l < n; l++)
          matrix[k * n + l] += pivot * matrix[i * n + l];
      }
      for (k = i + 1; k < n; k++) {
        pivot = matrix[k * n + j];
        for (l = j; l < n; l++)
          matrix[k * n + l] -= pivot * matrix[i * n + l];
      }
      i++;
    }
  }
  for (k = 0; k < nonpivot; k++) {
    j = buffer[k];
    for (l = 0; l < n - nonpivot; l++)
      nullspace[k * n + buffer[n + l]] = -matrix[l * n + j];
    for (l = 0; l < nonpivot; l++)
      nullspace[k * n + buffer[l]] = (j == buffer[l]) ? 1 : 0;
  }
  return nonpivot;
}
```