user: Translate the below assembly code into C programming language:

```asm
<lud_omp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  and    $0xffffffffffffffc0,%rsp
  sub    $0x900,%rsp
  mov    %rdi,0x28(%rsp)
  mov    %esi,0x24(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x8f8(%rsp)
  xor    %eax,%eax
  movl   $0x0,0x38(%rsp)
  jmp    L85
L28:
  mov    0x38(%rsp),%edx
  mov    0x24(%rsp),%ecx
  mov    0x28(%rsp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <lud_diagonal_omp@plt>
  mov    0x24(%rsp),%eax
  sub    0x38(%rsp),%eax
  sub    $0x10,%eax
  mov    %eax,0x5c(%rsp)
  mov    0x5c(%rsp),%eax
  lea    0xf(%rax),%edx
  test   %eax,%eax
  cmovs  %edx,%eax
  sar    $0x4,%eax
  mov    %eax,0x60(%rsp)
  movl   $0x0,0x3c(%rsp)
  jmp    L7
L322:
  movl   $0x0,0x40(%rsp)
  jmp    L34
L195:
  movl   $0x0,0x44(%rsp)
  jmp    L317
L24:
  mov    0x40(%rsp),%edx
  mov    0x38(%rsp),%eax
  add    %edx,%eax
  imul   0x24(%rsp),%eax
  mov    %eax,%edx
  mov    0x38(%rsp),%eax
  add    %eax,%edx
  mov    0x44(%rsp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  mov    0x40(%rsp),%edx
  mov    %edx,%ecx
  shl    $0x4,%ecx
  mov    0x44(%rsp),%edx
  add    %ecx,%edx
  movss  (%rax),%xmm0
  movslq %edx,%rax
  movss  %xmm0,0x4c0(%rsp,%rax,4)
  addl   $0x1,0x44(%rsp)
L317:
  cmpl   $0xf,0x44(%rsp)
  jle    L24
  addl   $0x1,0x40(%rsp)
L34:
  cmpl   $0xf,0x40(%rsp)
  jle    L195
  mov    0x38(%rsp),%eax
  mov    %eax,0x70(%rsp)
  mov    0x38(%rsp),%eax
  mov    %eax,0x74(%rsp)
  mov    0x3c(%rsp),%eax
  add    $0x1,%eax
  shl    $0x4,%eax
  add    %eax,0x74(%rsp)
  movl   $0x0,0x44(%rsp)
  jmp    L192
L247:
  movl   $0x0,0x40(%rsp)
  jmp    L333
L174:
  pxor   %xmm0,%xmm0
  movss  %xmm0,0x4c(%rsp)
  movl   $0x0,0x48(%rsp)
  jmp    L188
L53:
  mov    0x40(%rsp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    0x48(%rsp),%eax
  add    %edx,%eax
  cltq
  movss  0x4c0(%rsp,%rax,4),%xmm1
  mov    0x70(%rsp),%edx
  mov    0x48(%rsp),%eax
  add    %edx,%eax
  imul   0x24(%rsp),%eax
  mov    0x74(%rsp),%ecx
  mov    0x44(%rsp),%edx
  add    %ecx,%edx
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  0x4c(%rsp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,0x4c(%rsp)
  addl   $0x1,0x48(%rsp)
L188:
  mov    0x48(%rsp),%eax
  cmp    0x40(%rsp),%eax
  jl     L53
  mov    0x70(%rsp),%edx
  mov    0x40(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x78(%rsp)
  mov    0x74(%rsp),%edx
  mov    0x44(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x7c(%rsp)
  mov    0x78(%rsp),%eax
  imul   0x24(%rsp),%eax
  mov    %eax,%edx
  mov    0x7c(%rsp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    0x78(%rsp),%eax
  imul   0x24(%rsp),%eax
  mov    %eax,%edx
  mov    0x7c(%rsp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  subss  0x4c(%rsp),%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,0x40(%rsp)
L333:
  cmpl   $0xf,0x40(%rsp)
  jle    L174
  addl   $0x1,0x44(%rsp)
L192:
  cmpl   $0xf,0x44(%rsp)
  jle    L247
  mov    0x38(%rsp),%eax
  mov    %eax,0x74(%rsp)
  mov    0x3c(%rsp),%eax
  add    $0x1,%eax
  shl    $0x4,%eax
  add    %eax,0x70(%rsp)
  movl   $0x0,0x40(%rsp)
  jmp    L18
L288:
  movl   $0x0,0x44(%rsp)
  jmp    L285
L205:
  pxor   %xmm0,%xmm0
  movss  %xmm0,0x4c(%rsp)
  movl   $0x0,0x48(%rsp)
  jmp    L21
L203:
  mov    0x70(%rsp),%edx
  mov    0x40(%rsp),%eax
  add    %edx,%eax
  imul   0x24(%rsp),%eax
  mov    0x74(%rsp),%ecx
  mov    0x48(%rsp),%edx
  add    %ecx,%edx
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    0x48(%rsp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    0x44(%rsp),%eax
  add    %edx,%eax
  cltq
  movss  0x4c0(%rsp,%rax,4),%xmm0
  mulss  %xmm1,%xmm0
  movss  0x4c(%rsp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,0x4c(%rsp)
  addl   $0x1,0x48(%rsp)
L21:
  mov    0x48(%rsp),%eax
  cmp    0x44(%rsp),%eax
  jl     L203
  mov    0x70(%rsp),%edx
  mov    0x40(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x78(%rsp)
  mov    0x74(%rsp),%edx
  mov    0x44(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x7c(%rsp)
  mov    0x24(%rsp),%eax
  imul   0x78(%rsp),%eax
  mov    %eax,%edx
  mov    0x7c(%rsp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  subss  0x4c(%rsp),%xmm0
  mov    0x38(%rsp),%edx
  mov    0x44(%rsp),%eax
  add    %edx,%eax
  imul   0x24(%rsp),%eax
  mov    %eax,%edx
  mov    0x38(%rsp),%eax
  add    %eax,%edx
  mov    0x44(%rsp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    0x24(%rsp),%eax
  imul   0x78(%rsp),%eax
  mov    %eax,%edx
  mov    0x7c(%rsp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  divss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,0x44(%rsp)
L285:
  cmpl   $0xf,0x44(%rsp)
  jle    L205
  addl   $0x1,0x40(%rsp)
L18:
  cmpl   $0xf,0x40(%rsp)
  jle    L288
  addl   $0x1,0x3c(%rsp)
L7:
  mov    0x3c(%rsp),%eax
  cmp    0x60(%rsp),%eax
  jl     L322
  mov    0x60(%rsp),%eax
  imul   %eax,%eax
  mov    %eax,0x64(%rsp)
  movl   $0x0,0x3c(%rsp)
  jmp    L197
L141:
  movq   $0x0,0x80(%rsp)
  movq   $0x0,0x88(%rsp)
  movq   $0x0,0x90(%rsp)
  movq   $0x0,0x98(%rsp)
  movq   $0x0,0xa0(%rsp)
  movq   $0x0,0xa8(%rsp)
  movq   $0x0,0xb0(%rsp)
  movq   $0x0,0xb8(%rsp)
  mov    0x3c(%rsp),%eax
  cltd
  idivl  0x60(%rsp)
  add    $0x1,%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    0x38(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x68(%rsp)
  mov    0x3c(%rsp),%eax
  cltd
  idivl  0x60(%rsp)
  mov    %edx,%eax
  add    $0x1,%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    0x38(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x6c(%rsp)
  movl   $0x0,0x50(%rsp)
  jmp    L109
L111:
  movl   $0x0,0x54(%rsp)
  jmp    L163
L43:
  mov    0x50(%rsp),%edx
  mov    0x38(%rsp),%eax
  add    %edx,%eax
  imul   0x24(%rsp),%eax
  mov    %eax,%edx
  mov    0x54(%rsp),%eax
  add    %eax,%edx
  mov    0x6c(%rsp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  mov    0x50(%rsp),%edx
  mov    %edx,%ecx
  shl    $0x4,%ecx
  mov    0x54(%rsp),%edx
  add    %ecx,%edx
  movss  (%rax),%xmm0
  movslq %edx,%rax
  movss  %xmm0,0xc0(%rsp,%rax,4)
  mov    0x50(%rsp),%edx
  mov    0x68(%rsp),%eax
  add    %edx,%eax
  imul   0x24(%rsp),%eax
  mov    %eax,%edx
  mov    0x38(%rsp),%eax
  add    %eax,%edx
  mov    0x54(%rsp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  mov    0x50(%rsp),%edx
  mov    %edx,%ecx
  shl    $0x4,%ecx
  mov    0x54(%rsp),%edx
  add    %ecx,%edx
  movss  (%rax),%xmm0
  movslq %edx,%rax
  movss  %xmm0,0x4c0(%rsp,%rax,4)
  addl   $0x1,0x54(%rsp)
L163:
  cmpl   $0xf,0x54(%rsp)
  jle    L43
  addl   $0x1,0x50(%rsp)
L109:
  cmpl   $0xf,0x50(%rsp)
  jle    L111
  movl   $0x0,0x50(%rsp)
  jmp    L189
L339:
  movl   $0x0,0x58(%rsp)
  jmp    L29
L241:
  movl   $0x0,0x54(%rsp)
  jmp    L293
L253:
  mov    0x54(%rsp),%eax
  cltq
  movss  0x80(%rsp,%rax,4),%xmm1
  mov    0x50(%rsp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    0x58(%rsp),%eax
  add    %edx,%eax
  cltq
  movss  0x4c0(%rsp,%rax,4),%xmm2
  mov    0x58(%rsp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    0x54(%rsp),%eax
  add    %edx,%eax
  cltq
  movss  0xc0(%rsp,%rax,4),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  mov    0x54(%rsp),%eax
  cltq
  movss  %xmm0,0x80(%rsp,%rax,4)
  addl   $0x1,0x54(%rsp)
L293:
  cmpl   $0xf,0x54(%rsp)
  jle    L253
  addl   $0x1,0x58(%rsp)
L29:
  cmpl   $0xf,0x58(%rsp)
  jle    L241
  movl   $0x0,0x54(%rsp)
  jmp    L318
L135:
  mov    0x50(%rsp),%edx
  mov    0x68(%rsp),%eax
  add    %edx,%eax
  imul   0x24(%rsp),%eax
  mov    0x54(%rsp),%ecx
  mov    0x6c(%rsp),%edx
  add    %ecx,%edx
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    0x54(%rsp),%eax
  cltq
  movss  0x80(%rsp,%rax,4),%xmm1
  mov    0x50(%rsp),%edx
  mov    0x68(%rsp),%eax
  add    %edx,%eax
  imul   0x24(%rsp),%eax
  mov    0x54(%rsp),%ecx
  mov    0x6c(%rsp),%edx
  add    %ecx,%edx
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    0x28(%rsp),%rax
  add    %rdx,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    0x54(%rsp),%eax
  cltq
  pxor   %xmm0,%xmm0
  movss  %xmm0,0x80(%rsp,%rax,4)
  addl   $0x1,0x54(%rsp)
L318:
  cmpl   $0xf,0x54(%rsp)
  jle    L135
  addl   $0x1,0x50(%rsp)
L189:
  cmpl   $0xf,0x50(%rsp)
  jle    L339
  addl   $0x1,0x3c(%rsp)
L197:
  mov    0x3c(%rsp),%eax
  cmp    0x64(%rsp),%eax
  jl     L141
  addl   $0x10,0x38(%rsp)
L85:
  mov    0x24(%rsp),%eax
  sub    $0x10,%eax
  cmp    %eax,0x38(%rsp)
  jl     L28
  mov    0x38(%rsp),%edx
  mov    0x24(%rsp),%ecx
  mov    0x28(%rsp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <lud_diagonal_omp@plt>
  nop
  mov    0x8f8(%rsp),%rax
  sub    %fs:0x28,%rax
  je     L102
  call   <__stack_chk_fail@plt>
L102:
  leave
  ret
```

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);
  }
}
```