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

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x348,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x338(%rsp)
  xor    %eax,%eax
  call   <init_platform@plt>
  lea    D29(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%eax
  call   <target_timer_initialize@plt>
  mov    $0x0,%eax
  call   <target_timer_get_current@plt>
  mov    %eax,%edi
  call   <srand@plt>
  mov    $0x0,%eax
L7:
  mov    %eax,(%rsp,%rax,4)
  add    $0x1,%rax
  cmp    $0x32,%rax
  jne    L7
  mov    $0x0,%eax
  call   <target_timer_initialize@plt>
  mov    $0x0,%eax
  call   <target_timer_get_current@plt>
  mov    %eax,%r15d
  lea    0xd0(%rsp),%rsi
  mov    %rsp,%rbx
  mov    %rbx,%rdi
  call   <arrayadd_interrupt@plt>
  mov    $0x0,%eax
  call   <target_timer_get_current@plt>
  mov    %eax,%r12d
  mov    $0x0,%eax
  call   <target_timer_initialize@plt>
  mov    $0x0,%eax
  call   <target_timer_get_current@plt>
  mov    %eax,%r14d
  lea    0x1a0(%rsp),%rsi
  mov    %rbx,%rdi
  call   <arrayadd@plt>
  mov    $0x0,%eax
  call   <target_timer_get_current@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <Xil_DCacheEnable@plt>
  mov    $0x0,%eax
  call   <target_timer_initialize@plt>
  mov    $0x0,%eax
  call   <target_timer_get_current@plt>
  mov    %eax,%r13d
  lea    0x270(%rsp),%rsi
  mov    %rbx,%rdi
  call   <arrayadd_soft@plt>
  mov    $0x0,%eax
  call   <target_timer_get_current@plt>
  mov    %eax,%ebx
  mov    %r12d,%esi
  sub    %r15d,%esi
  lea    D30(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %ebp,%esi
  sub    %r14d,%esi
  lea    D13(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  sub    %r13d,%ebx
  mov    %ebx,%esi
  lea    D25(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D6(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%eax
  call   <cleanup_platform@plt>
  mov    0x338(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L2
  mov    $0x0,%eax
  add    $0x348,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L2:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D29
data_type: string
name: retrieve_data
arguments: data_label: D30
data_type: string
name: retrieve_data
arguments: data_label: D13
data_type: string
name: retrieve_data
arguments: data_label: D25
data_type: string
name: retrieve_data
arguments: data_label: D6
data_type: string

tool: D29: Hello! matrixmul


tool: D30: hard interr time:%d


tool: D13: hard poling time:%d


tool: D25: soft time:%d


tool: D6: end matrixmul


assistant: ```c
int main() {
  int tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
  init_platform();
  printf("Hello! matrixmul\n\r");
  int i, j;
  target_timer_initialize();
  srand(target_timer_get_current());
  int a[50], b[50], c[50], d[50];
  for (i = 0; i < 50; i++) {
    a[i] = i;
  }
  target_timer_initialize();
  tmp1 = target_timer_get_current();
  arrayadd_interrupt(a, b);
  tmp2 = target_timer_get_current();
  target_timer_initialize();
  tmp3 = target_timer_get_current();
  arrayadd(a, c);
  tmp4 = target_timer_get_current();
  Xil_DCacheEnable();
  target_timer_initialize();
  tmp5 = target_timer_get_current();
  arrayadd_soft(a, d);
  tmp6 = target_timer_get_current();
  printf("hard interr time:%d\n", tmp2 - tmp1);
  printf("hard poling time:%d\n", tmp4 - tmp3);
  printf("soft time:%d\n", tmp6 - tmp5);
  printf("end matrixmul\n\r");
  cleanup_platform();
  return 0;
}
```