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

```asm
<test_lu>:
  endbr64
  push   %r12
  lea    D21(%rip),%rdi
  push   %rbp
  sub    $0x8,%rsp
  call   <printf@plt>
  mov    $0x240,%edi
  call   <malloc@plt>
  mov    $0x40,%edi
  mov    %rax,%rbp
  call   <malloc@plt>
  movapd D28(%rip),%xmm1
  mov    $0x8,%esi
  mov    %rbp,%rdi
  movapd D219(%rip),%xmm0
  mov    %rax,%r12
  movups %xmm1,0x70(%rbp)
  movapd D222(%rip),%xmm1
  movups %xmm0,0x0(%rbp)
  movq   D215(%rip),%xmm0
  movups %xmm1,0x80(%rbp)
  movq   D66(%rip),%xmm1
  movups %xmm0,0x10(%rbp)
  movapd D12(%rip),%xmm0
  movups %xmm1,0x90(%rbp)
  movapd D23(%rip),%xmm1
  movups %xmm0,0x20(%rbp)
  movapd D178(%rip),%xmm0
  movups %xmm1,0xa0(%rbp)
  movapd D155(%rip),%xmm1
  movups %xmm0,0x30(%rbp)
  movapd D166(%rip),%xmm0
  movups %xmm1,0xb0(%rbp)
  movapd D120(%rip),%xmm1
  movups %xmm0,0x40(%rbp)
  movq   D210(%rip),%xmm0
  movups %xmm1,0xd0(%rbp)
  movapd D72(%rip),%xmm1
  movups %xmm0,0x50(%rbp)
  pxor   %xmm0,%xmm0
  movups %xmm1,0xf0(%rbp)
  movapd D246(%rip),%xmm1
  movups %xmm0,0x60(%rbp)
  movups %xmm0,0xc0(%rbp)
  movups %xmm0,0xe0(%rbp)
  movups %xmm0,0x100(%rbp)
  movups %xmm0,0x110(%rbp)
  movups %xmm1,0x120(%rbp)
  movq   D0(%rip),%xmm1
  movapd D29(%rip),%xmm2
  movups %xmm0,0x130(%rbp)
  movups %xmm0,0x1a0(%rbp)
  movapd D5(%rip),%xmm0
  movups %xmm1,0x140(%rbp)
  movq   D122(%rip),%xmm1
  movups %xmm0,0x1b0(%rbp)
  movapd D20(%rip),%xmm0
  movups %xmm1,0x150(%rbp)
  movq   D157(%rip),%xmm1
  movups %xmm0,0x1c0(%rbp)
  movapd D9(%rip),%xmm0
  movups %xmm1,0x160(%rbp)
  movapd D180(%rip),%xmm1
  movups %xmm0,0x1d0(%rbp)
  movapd D199(%rip),%xmm0
  movups %xmm2,0x180(%rbp)
  movapd D54(%rip),%xmm2
  movups %xmm0,0x1f0(%rbp)
  movapd D53(%rip),%xmm0
  movups %xmm1,0x170(%rbp)
  movups %xmm0,0x200(%rbp)
  movapd D140(%rip),%xmm0
  movups %xmm2,0x190(%rbp)
  movups %xmm0,0x210(%rbp)
  movapd D33(%rip),%xmm0
  movups %xmm1,0x1e0(%rbp)
  movups %xmm0,0x220(%rbp)
  movapd D227(%rip),%xmm0
  movups %xmm0,0x230(%rbp)
  call   <NUM_print_matrix@plt>
  mov    $0x8,%edx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <NUM_lu@plt>
  test   %rax,%rax
  je     L2
  lea    D175(%rip),%rdi
  call   <printf@plt>
L19:
  lea    D300(%rip),%rdi
  call   <printf@plt>
  add    $0x8,%rsp
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L2:
  mov    $0x8,%esi
  mov    %r12,%rdi
  call   <NUM_print_vec@plt>
  jmp    L19
```

tool_calls: name: read_data
arguments: tag: D21
datatype: string
name: read_data
arguments: tag: D28
datatype: byte[16]
name: read_data
arguments: tag: D219
datatype: byte[16]
name: read_data
arguments: tag: D222
datatype: byte[16]
name: read_data
arguments: tag: D215
datatype: byte[8]
name: read_data
arguments: tag: D66
datatype: byte[8]
name: read_data
arguments: tag: D12
datatype: byte[16]
name: read_data
arguments: tag: D23
datatype: byte[16]
name: read_data
arguments: tag: D178
datatype: byte[16]
name: read_data
arguments: tag: D155
datatype: byte[16]
name: read_data
arguments: tag: D166
datatype: byte[16]
name: read_data
arguments: tag: D120
datatype: byte[16]
name: read_data
arguments: tag: D210
datatype: byte[8]
name: read_data
arguments: tag: D72
datatype: byte[16]
name: read_data
arguments: tag: D246
datatype: byte[16]
name: read_data
arguments: tag: D0
datatype: byte[8]
name: read_data
arguments: tag: D29
datatype: byte[16]
name: read_data
arguments: tag: D5
datatype: byte[16]
name: read_data
arguments: tag: D122
datatype: byte[8]
name: read_data
arguments: tag: D20
datatype: byte[16]
name: read_data
arguments: tag: D157
datatype: byte[8]
name: read_data
arguments: tag: D9
datatype: byte[16]
name: read_data
arguments: tag: D180
datatype: byte[16]
name: read_data
arguments: tag: D199
datatype: byte[16]
name: read_data
arguments: tag: D54
datatype: byte[16]
name: read_data
arguments: tag: D53
datatype: byte[16]
name: read_data
arguments: tag: D140
datatype: byte[16]
name: read_data
arguments: tag: D33
datatype: byte[16]
name: read_data
arguments: tag: D227
datatype: byte[16]
name: read_data
arguments: tag: D175
datatype: string
name: read_data
arguments: tag: D300
datatype: string

tool: D21: Testing the LU factorisation algotythm.


tool: {"D28": [0xae,0x39,0xf6,0xa2,0x2c,0x32,0xb6,0x3f,0xae,0x47,0xe1,0x7a,0x14,0xfe,0x64,0x40]}

tool: {"D219": [0xb1,0x7a,0x76,0xaf,0x49,0x6d,0xa8,0x3f,0xba,0xdb,0xf5,0xd2,0x14,0x01,0xbe,0x3f]}

tool: {"D222": [0xc9,0xff,0xe4,0xef,0xde,0x51,0x93,0x3f,0xbb,0xde,0xec,0xc5,0x06,0xc1,0x89,0x3f]}

tool: {"D215": [0xc9,0xff,0xe4,0xef,0xde,0x51,0x93,0x3f]}

tool: {"D66": [0x49,0x48,0xa4,0x6d,0xfc,0x89,0xa6,0x3f]}

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

tool: {"D23": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40]}

tool: {"D178": [0x8b,0x68,0xe0,0xec,0x7b,0x79,0x9e,0x3f,0x07,0xf0,0x16,0x48,0x50,0xcc,0x49,0x40]}

tool: {"D155": [0x78,0x37,0x60,0xa1,0x20,0xc2,0x99,0x3f,0x71,0x3d,0x0a,0xd7,0xa3,0xac,0x52,0xc0]}

tool: {"D166": [0xba,0xdb,0xf5,0xd2,0x14,0x01,0xbe,0x3f,0x0b,0x5e,0xf4,0x15,0xa4,0x19,0xda,0x3f]}

tool: {"D120": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x13,0x4b,0x25,0x97,0x5a,0x8a,0x3f]}

tool: {"D210": [0xbb,0xde,0xec,0xc5,0x06,0xc1,0x89,0x3f]}

tool: {"D72": [0x6a,0xef,0x7c,0xd4,0x99,0x5a,0x7a,0x3f,0x69,0xe5,0x5e,0x60,0x56,0x28,0xe7,0xbf]}

tool: {"D246": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

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

tool: {"D29": [0x8b,0x68,0xe0,0xec,0x7b,0x79,0x9e,0x3f,0xae,0x39,0xf6,0xa2,0x2c,0x32,0xb6,0x3f]}

tool: {"D5": [0x1b,0x2f,0x38,0xde,0x78,0xd2,0x8d,0x3f,0x78,0x9c,0xa2,0x23,0xb9,0xac,0x3e,0xc0]}

tool: {"D122": [0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40]}

tool: {"D20": [0x07,0xf0,0x16,0x48,0x50,0xcc,0x49,0x40,0xae,0x47,0xe1,0x7a,0x14,0xfe,0x64,0x40]}

tool: {"D157": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

tool: {"D9": [0x71,0x3d,0x0a,0xd7,0xa3,0xac,0x52,0xc0,0x69,0xe5,0x5e,0x60,0x56,0x28,0xe7,0xbf]}

tool: {"D180": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x28,0x5c,0x8f,0xa2,0xeb,0xc2,0xc0]}

tool: {"D199": [0x78,0x9c,0xa2,0x23,0xb9,0xac,0x3e,0xc0,0x00,0x00,0x00,0x00,0xb8,0x99,0x1c,0x41]}

tool: {"D54": [0x78,0x37,0x60,0xa1,0x20,0xc2,0x99,0x3f,0x6a,0xef,0x7c,0xd4,0x99,0x5a,0x7a,0x3f]}

tool: {"D53": [0x45,0x47,0x72,0xf9,0x0f,0x89,0x26,0xc0,0xd8,0xd8,0x25,0xaa,0xb7,0x96,0x20,0x40]}

tool: {"D140": [0x4a,0x0c,0x02,0x2b,0x87,0x7a,0x52,0xc0,0x7d,0x24,0x25,0x3d,0x0c,0x2d,0xe3,0xbf]}

tool: {"D33": [0x9b,0xef,0x96,0x9a,0xf3,0x42,0x90,0x3f,0xe1,0x7a,0x14,0xae,0x87,0xcd,0xc2,0xc0]}

tool: {"D227": [0xe0,0x2d,0x90,0xa0,0xf8,0x31,0x47,0xc0,0x00,0x00,0x00,0x00,0x90,0xf7,0x0c,0x41]}

tool: D175: No solution: Error in the numerical method,


tool: D300: 


assistant: ```c
int test_lu(void) {
  int i;
  double *matrix;
  double *solution;
  int size = 8;
  printf("Testing the LU factorisation algotythm.\n");
  matrix = (double *)malloc(sizeof(double) * size * (size + 1));
  solution = (double *)malloc(sizeof(double) * size);
  matrix[0] = 4.77088e-02;
  matrix[8] = 1.17204e-01;
  matrix[16] = 1.88670e-02;
  matrix[1] = 1.17204e-01;
  matrix[9] = 4.07815e-01;
  matrix[17] = 1.25752e-02;
  matrix[2] = 1.88670e-02;
  matrix[10] = 1.25752e-02;
  matrix[18] = 4.40215e-02;
  matrix[3] = 0.00000e+00;
  matrix[11] = 0.00000e+00;
  matrix[19] = 0.00000e+00;
  matrix[4] = 0.00000e+00;
  matrix[12] = 0.00000e+00;
  matrix[20] = 0.00000e+00;
  matrix[5] = 1.00000e+00;
  matrix[13] = 0.00000e+00;
  matrix[21] = 3.00000e+00;
  matrix[6] = 2.97603e-02;
  matrix[14] = 8.67031e-02;
  matrix[22] = 2.51546e-02;
  matrix[7] = 5.15962e+01;
  matrix[15] = 1.67940e+02;
  matrix[23] = -7.46975e+01;
  matrix[24] = 0.00000e+00;
  matrix[25] = 0.00000e+00;
  matrix[26] = 0.00000e+00;
  matrix[27] = 1.28681e-02;
  matrix[28] = 0.00000e+00;
  matrix[29] = 0.00000e+00;
  matrix[30] = 6.43406e-03;
  matrix[31] = -7.23674e-01;
  matrix[32] = 0.0000e+00;
  matrix[40] = 1.00000e+00;
  matrix[48] = 2.97603e-02;
  matrix[33] = 0.0000e+00;
  matrix[41] = 0.00000e+00;
  matrix[49] = 8.67031e-02;
  matrix[34] = 0.0000e+00;
  matrix[42] = 3.00000e+00;
  matrix[50] = 2.51546e-02;
  matrix[35] = 0.0000e+00;
  matrix[43] = 0.00000e+00;
  matrix[51] = 6.43406e-03;
  matrix[36] = 0.0000e+00;
  matrix[44] = 2.00000e+00;
  matrix[52] = 0.00000e+00;
  matrix[37] = 2.0000e+00;
  matrix[45] = 0.00000e+00;
  matrix[53] = 0.00000e+00;
  matrix[38] = 0.0000e+00;
  matrix[46] = 0.00000e+00;
  matrix[54] = 1.45616e-02;
  matrix[39] = 0.0000e+00;
  matrix[47] = -9.68727e+03;
  matrix[55] = -3.06747e+01;
  matrix[56] = 5.15962e+01;
  matrix[64] = -1.12677e+01;
  matrix[57] = 1.67940e+02;
  matrix[65] = 8.29437e+00;
  matrix[58] = -7.46975e+01;
  matrix[66] = -7.39145e+01;
  matrix[59] = -7.23674e-01;
  matrix[67] = -5.99249e-01;
  matrix[60] = 0.00000e+00;
  matrix[68] = 1.58804e-02;
  matrix[61] = -9.68727e+03;
  matrix[69] = -9.62706e+03;
  matrix[62] = -3.06747e+01;
  matrix[70] = -4.63904e+01;
  matrix[63] = 4.68590e+05;
  matrix[71] = 2.37298e+05;
  NUM_print_matrix(matrix, size);
  if (NUM_lu(matrix, solution, size))
    printf("No solution: Error in the numerical method,\n");
  else
    NUM_print_vec(solution, size);
  printf("\n");
  return 0;
}
```