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

```asm
<lud_omp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbx
  and    $0xffffffffffffffc0,%rsp
  sub    $0x940,%rsp
  mov    %rdi,%r15
  mov    %esi,0xb4(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x938(%rsp)
  xor    %eax,%eax
  lea    -0x10(%rsi),%ebx
  mov    %ebx,0x70(%rsp)
  test   %ebx,%ebx
  jle    L295
  mov    %esi,%eax
  mov    %esi,%ebx
  shl    $0x4,%ebx
  mov    %ebx,0xb0(%rsp)
  movslq %ebx,%rbx
  mov    %rbx,0x48(%rsp)
  lea    0x40(,%rbx,4),%rdi
  mov    %rdi,0x40(%rsp)
  mov    %r15,0xa8(%rsp)
  shl    $0x2,%rbx
  mov    %rbx,0x50(%rsp)
  cltq
  lea    0x0(,%rax,4),%r14
  lea    0x4(%r14),%rax
  mov    %rax,0x60(%rsp)
  movl   $0x0,0x7c(%rsp)
  movq   $0x0,0xb8(%rsp)
  movq   $0x0,0x98(%rsp)
  mov    %esi,%eax
  sub    $0x10,%eax
  mov    %eax,0x68(%rsp)
  lea    0x100(%rsp),%r13
  lea    0x500(%rsp),%r12
  jmp    L312
L112:
  mov    %r9,%rdx
  mov    %r8,%rax
  pxor   %xmm1,%xmm1
L48:
  movss  (%rax),%xmm0
  mulss  (%rdx),%xmm0
  addss  %xmm0,%xmm1
  add    $0x4,%rax
  add    %r14,%rdx
  cmp    %rcx,%rax
  jne    L48
L109:
  add    %r14,%rdi
  add    $0x40,%r8
  add    $0x44,%rcx
L255:
  movss  (%rdi),%xmm0
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rdi)
  add    $0x1,%esi
  cmp    $0x10,%esi
  je     L103
  pxor   %xmm1,%xmm1
  test   %esi,%esi
  jg     L112
  jmp    L109
L103:
  add    $0x1,%r11d
  add    $0x4,%r9
  cmp    %ebx,%r11d
  je     L160
L294:
  mov    0xa0(%rsp),%rax
  lea    (%r9,%rax,1),%rdi
  lea    0x540(%rsp),%r8
  lea    0x44(%r12),%rcx
  mov    $0x0,%esi
  pxor   %xmm1,%xmm1
  jmp    L255
L163:
  mov    %r8,%rax
  mov    %r11,%rdx
  pxor   %xmm1,%xmm1
L54:
  movss  (%rdx),%xmm0
  mulss  0x4(%rax),%xmm0
  addss  %xmm0,%xmm1
  add    $0x4,%rdx
  add    $0x40,%rax
  cmp    %rcx,%rax
  jne    L54
L179:
  add    $0x1,%rsi
  add    %r10,%rdi
  add    $0x4,%r8
  add    $0x44,%rcx
L225:
  movss  -0x4(%r9,%rsi,4),%xmm0
  subss  %xmm1,%xmm0
  divss  (%rdi),%xmm0
  movss  %xmm0,-0x4(%r9,%rsi,4)
  cmp    $0x10,%rsi
  je     L256
  pxor   %xmm1,%xmm1
  test   %esi,%esi
  jg     L163
  jmp    L179
L256:
  add    %r14,%r9
  add    0xb4(%rsp),%r13d
  sub    $0x1,%ebx
  je     L251
L55:
  lea    0x40(%r12),%rcx
  movslq %r13d,%rax
  add    0xb8(%rsp),%rax
  lea    (%r15,%rax,4),%r11
  mov    %r12,%r8
  mov    0xa8(%rsp),%rdi
  mov    $0x1,%esi
  pxor   %xmm1,%xmm1
  jmp    L225
L160:
  mov    0x90(%rsp),%r13d
  mov    0x88(%rsp),%r9
  mov    $0x10,%ebx
  jmp    L55
L251:
  mov    0x50(%rsp),%rbx
  add    %rbx,0x88(%rsp)
  mov    0xb0(%rsp),%ebx
  add    %ebx,0x90(%rsp)
  addq   $0x40,0x80(%rsp)
  mov    0x78(%rsp),%ebx
  cmp    %ebx,0x94(%rsp)
  jge    L111
  mov    0x3c(%rsp),%esi
L70:
  mov    %r12,%rdx
  mov    0xa8(%rsp),%rcx
  mov    0x58(%rsp),%rdi
L162:
  mov    $0x0,%eax
L196:
  movss  (%rcx,%rax,1),%xmm0
  movss  %xmm0,(%rdx,%rax,1)
  add    $0x4,%rax
  cmp    $0x40,%rax
  jne    L196
  add    %r14,%rcx
  add    $0x40,%rdx
  cmp    %rdi,%rdx
  jne    L162
  addl   $0x1,0x94(%rsp)
  mov    0x80(%rsp),%r9
  mov    %esi,%r11d
  lea    0x10(%rsi),%ebx
  mov    %ebx,0x3c(%rsp)
  jmp    L294
L61:
  imul   %r11d,%r11d
  mov    %r11d,%r8d
  test   %r11d,%r11d
  jle    L324
  jmp    L239
L168:
  mov    0xb4(%rsp),%eax
  sub    $0x11,%eax
  and    $0xfffffff0,%eax
  lea    0x10(%rax),%edx
L81:
  mov    0xb4(%rsp),%esi
  mov    %r15,%rdi
  call   <lud_diagonal_omp@plt>
  mov    0x938(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L299
  lea    -0x28(%rbp),%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  pop    %rbp
  ret
L295:
  mov    $0x0,%edx
  jmp    L81
L111:
  mov    0x78(%rsp),%r11d
  mov    0x30(%rsp),%r13
  imul   %r11d,%r11d
  mov    %r11d,%r8d
L239:
  mov    $0x0,%ebx
L1:
  movq   $0x0,0xc0(%rsp)
  movq   $0x0,0xc8(%rsp)
  movq   $0x0,0xd0(%rsp)
  movq   $0x0,0xd8(%rsp)
  movq   $0x0,0xe0(%rsp)
  movq   $0x0,0xe8(%rsp)
  movq   $0x0,0xf0(%rsp)
  movq   $0x0,0xf8(%rsp)
  mov    %ebx,%eax
  cltd
  idivl  0x74(%rsp)
  lea    0x1(%rdx),%r10d
  shl    $0x4,%r10d
  mov    0x6c(%rsp),%esi
  add    %esi,%r10d
  movslq %r10d,%r10
  mov    0x98(%rsp),%rdi
  lea    (%r10,%rdi,1),%rdx
  lea    (%r15,%rdx,4),%rdi
  lea    0x1(%rax),%r11d
  shl    $0x4,%r11d
  add    %esi,%r11d
  imul   0xb4(%rsp),%r11d
  movslq %r11d,%r11
  mov    0xb8(%rsp),%rax
  add    %r11,%rax
  lea    (%r15,%rax,4),%rsi
  lea    0x500(%rsp),%r9
  mov    %r9,%rcx
  mov    %r13,%rdx
L214:
  mov    $0x0,%eax
L291:
  movss  (%rdi,%rax,1),%xmm0
  movss  %xmm0,(%rdx,%rax,1)
  movss  (%rsi,%rax,1),%xmm0
  movss  %xmm0,(%rcx,%rax,1)
  add    $0x4,%rax
  cmp    $0x40,%rax
  jne    L291
  add    %r14,%rdi
  add    $0x40,%rdx
  add    %r14,%rsi
  add    $0x40,%rcx
  cmp    %r12,%rdx
  jne    L214
  add    %r11,%r10
  lea    (%r15,%r10,4),%r10
  lea    0x400(%r9),%r11
L213:
  mov    %r13,%rsi
  mov    %r9,%rdi
L68:
  movss  (%rdi),%xmm1
  lea    0xc0(%rsp),%rcx
  mov    %rsi,%rdx
  mov    %rcx,%rax
L189:
  movaps %xmm1,%xmm0
  mulss  (%rdx),%xmm0
  addss  (%rax),%xmm0
  movss  %xmm0,(%rax)
  add    $0x4,%rax
  add    $0x4,%rdx
  cmp    %rax,%r13
  jne    L189
  add    $0x4,%rdi
  add    $0x40,%rsi
  cmp    %r12,%rsi
  jne    L68
  mov    %r10,%rax
L322:
  movss  (%rax),%xmm0
  subss  (%rcx),%xmm0
  movss  %xmm0,(%rax)
  movl   $0x0,(%rcx)
  add    $0x4,%rax
  add    $0x4,%rcx
  cmp    %r13,%rcx
  jne    L322
  add    %r14,%r10
  add    $0x40,%r9
  cmp    %r11,%r9
  jne    L213
  add    $0x1,%ebx
  cmp    %ebx,%r8d
  jg     L1
L324:
  mov    0x48(%rsp),%rbx
  add    %rbx,0x98(%rsp)
  addq   $0x10,0xb8(%rsp)
  mov    0xb8(%rsp),%rax
  mov    0x40(%rsp),%rdi
  add    %rdi,0xa8(%rsp)
  mov    0xb0(%rsp),%edi
  add    %edi,0x7c(%rsp)
  cmp    %eax,0x70(%rsp)
  jle    L168
L312:
  mov    0xb8(%rsp),%rbx
  mov    %ebx,%edx
  mov    %ebx,0x6c(%rsp)
  mov    0xb4(%rsp),%esi
  mov    %r15,%rdi
  call   <lud_diagonal_omp@plt>
  mov    0x68(%rsp),%edx
  sub    %ebx,%edx
  lea    0xf(%rdx),%eax
  cmovns %edx,%eax
  mov    %eax,%r11d
  sar    $0x4,%r11d
  mov    %r11d,0x74(%rsp)
  mov    0xb4(%rsp),%eax
  sub    %ebx,%eax
  cmp    $0x1f,%eax
  jle    L61
  mov    0x7c(%rsp),%edi
  mov    %edi,%eax
  add    0xb0(%rsp),%eax
  mov    %eax,0x90(%rsp)
  cltq
  add    %rbx,%rax
  lea    (%r15,%rax,4),%rax
  mov    %rax,0x88(%rsp)
  lea    0x10(%rbx),%esi
  movslq %edi,%rax
  lea    0x10(%rax,%rbx,1),%rdx
  lea    (%r15,%rdx,4),%rbx
  mov    %rbx,0x80(%rsp)
  mov    0x98(%rsp),%rdx
  sub    %rax,%rdx
  lea    0x0(,%rdx,4),%rax
  mov    %rax,0xa0(%rsp)
  movl   $0x0,0x94(%rsp)
  lea    0x900(%rsp),%rax
  mov    %rax,0x58(%rsp)
  mov    0x60(%rsp),%r10
  mov    %r11d,0x78(%rsp)
  mov    %r13,0x30(%rsp)
  jmp    L70
L299:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void lud_omp(float *a, int size) {
#pragma omp_to_hclib
  {
    int offset, chunk_idx, size_inter, chunks_in_inter_row, chunks_per_inter;
    for (offset = 0; offset < size - 16; offset += 16) {
      lud_diagonal_omp(a, size, offset);
      size_inter = size - offset - 16;
      chunks_in_inter_row = size_inter / 16;
#pragma omp parallel for default(none) private(chunk_idx) firstprivate(size, a) shared(chunks_per_inter, chunks_in_inter_row, offset)
      for (chunk_idx = 0; chunk_idx < chunks_in_inter_row; chunk_idx++) {
        int i, j, k, i_global, j_global, i_here, j_here;
        float sum;
        float temp[16 * 16] __attribute__((aligned(64)));
        for (i = 0; i < 16; i++) {
#pragma omp simd
          for (j = 0; j < 16; j++) {
            temp[i * 16 + j] = a[size * (i + offset) + offset + j];
          }
        }
        i_global = offset;
        j_global = offset;
        j_global += 16 * (chunk_idx + 1);
        for (j = 0; j < 16; j++) {
          for (i = 0; i < 16; i++) {
            sum = 0.f;
            for (k = 0; k < i; k++) {
              sum += temp[16 * i + k] * a[(i_global + k) * size + (j_global + j)];
            }
            i_here = i_global + i;
            j_here = j_global + j;
            a[i_here * size + j_here] = a[i_here * size + j_here] - sum;
          }
        }
        j_global = offset;
        i_global += 16 * (chunk_idx + 1);
        for (i = 0; i < 16; i++) {
          for (j = 0; j < 16; j++) {
            sum = 0.f;
            for (k = 0; k < j; k++) {
              sum += a[(i_global + i) * size + (j_global + k)] * temp[16 * k + j];
            }
            i_here = i_global + i;
            j_here = j_global + j;
            a[size * i_here + j_here] = (a[size * i_here + j_here] - sum) / a[size * (offset + j) + offset + j];
          }
        }
      }
      chunks_per_inter = chunks_in_inter_row * chunks_in_inter_row;
#pragma omp parallel for schedule(auto) default(none) private(chunk_idx) firstprivate(size, a) shared(chunks_per_inter, chunks_in_inter_row, offset)
      for (chunk_idx = 0; chunk_idx < chunks_per_inter; chunk_idx++) {
        int i, j, k, i_global, j_global;
        float temp_top[16 * 16] __attribute__((aligned(64)));
        float temp_left[16 * 16] __attribute__((aligned(64)));
        float sum[16] __attribute__((aligned(64))) = {0.f};
        i_global = offset + 16 * (1 + chunk_idx / chunks_in_inter_row);
        j_global = offset + 16 * (1 + chunk_idx % chunks_in_inter_row);
        for (i = 0; i < 16; i++) {
#pragma omp simd
          for (j = 0; j < 16; j++) {
            temp_top[i * 16 + j] = a[size * (i + offset) + j + j_global];
            temp_left[i * 16 + j] = a[size * (i + i_global) + offset + j];
          }
        }
        for (i = 0; i < 16; i++) {
          for (k = 0; k < 16; k++) {
#pragma omp simd
            for (j = 0; j < 16; j++) {
              sum[j] += temp_left[16 * i + k] * temp_top[16 * k + j];
            }
          }
#pragma omp simd
          for (j = 0; j < 16; j++) {
            a[(i + i_global) * size + (j + j_global)] -= sum[j];
            sum[j] = 0.f;
          }
        }
      }
    }
    lud_diagonal_omp(a, size, offset);
  }
}
```