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

```asm
<dyaddown_2D_keep_odd>:
  endbr64
  push   %r15
  mov    %edx,%r15d
  push   %r14
  mov    %rdi,%r14
  mov    %esi,%edi
  push   %r13
  imul   %edx,%edi
  push   %r12
  mov    %rcx,%r12
  push   %rbp
  mov    %r9d,%ebp
  push   %rbx
  shl    $0x3,%edi
  mov    %r8d,%ebx
  sub    $0x18,%rsp
  mov    %esi,0x8(%rsp)
  call   <malloc@plt>
  mov    0x8(%rsp),%r10d
  mov    %r14,%rdi
  mov    %ebp,%r8d
  mov    %rax,%rcx
  mov    %r15d,%esi
  mov    %rax,%r13
  mov    %r10d,%r9d
  mov    %r10d,%edx
  mov    %r10d,0xc(%rsp)
  call   <matrix_tran@plt>
  mov    %r15d,%r8d
  imul   %ebx,%r8d
  shl    $0x3,%r8d
  mov    %r8d,%edi
  mov    %r8d,0x8(%rsp)
  call   <malloc@plt>
  test   %ebx,%ebx
  mov    0x8(%rsp),%r8d
  mov    0xc(%rsp),%r10d
  mov    %rax,%r14
  jle    L74
  xor    %r9d,%r9d
  xor    %r11d,%r11d
  lea    -0x1(%r15),%edi
  nopl   0x0(%rax)
L60:
  test   %r15d,%r15d
  jle    L17
  lea    (%r9,%r9,1),%eax
  cltq
  lea    0x0(%r13,%rax,8),%rsi
  movslq %r9d,%rax
  lea    (%r14,%rax,8),%rcx
  xor    %eax,%eax
  nopl   0x0(%rax)
L32:
  movsd  (%rsi,%rax,8),%xmm0
  mov    %rax,%rdx
  movsd  %xmm0,(%rcx,%rax,8)
  add    $0x1,%rax
  cmp    %rdx,%rdi
  jne    L32
L17:
  add    $0x1,%r11d
  add    %r15d,%r9d
  cmp    %r11d,%ebx
  jne    L60
L74:
  mov    %r13,%rdi
  mov    %r10d,0xc(%rsp)
  mov    %r8d,0x8(%rsp)
  call   <free@plt>
  mov    0x8(%rsp),%edi
  call   <malloc@plt>
  mov    0xc(%rsp),%r8d
  mov    %r14,%rdi
  mov    %ebp,%r9d
  mov    %rax,%rcx
  mov    %r15d,%edx
  mov    %ebx,%esi
  mov    %rax,%r13
  call   <matrix_tran@plt>
  mov    %r14,%rdi
  call   <free@plt>
  test   %ebp,%ebp
  jle    L54
  xor    %r8d,%r8d
  xor    %r9d,%r9d
  lea    -0x1(%rbx),%edi
  nopl   (%rax)
L31:
  test   %ebx,%ebx
  jle    L68
  lea    (%r8,%r8,1),%eax
  cltq
  lea    0x0(%r13,%rax,8),%rsi
  movslq %r8d,%rax
  lea    (%r12,%rax,8),%rcx
  xor    %eax,%eax
  nopl   0x0(%rax,%rax,1)
L59:
  movsd  (%rsi,%rax,8),%xmm0
  mov    %rax,%rdx
  movsd  %xmm0,(%rcx,%rax,8)
  add    $0x1,%rax
  cmp    %rdi,%rdx
  jne    L59
L68:
  add    $0x1,%r9d
  add    %ebx,%r8d
  cmp    %r9d,%ebp
  jne    L31
L54:
  add    $0x18,%rsp
  mov    %r13,%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1070 <free@plt>
```

assistant: ```c
void dyaddown_2D_keep_odd(double *matrixIn, int matrixInRow, int matrixInCol, double *matrixOut, int matrixOutRow, int matrixOutCol) {
  int row, col;
  double *matrixInTemp, *matrixOutPre, *matrixOutTemp;
  matrixInTemp = malloc(matrixInRow * matrixInCol * sizeof(double));
  matrix_tran(matrixIn, matrixInCol, matrixInRow, matrixInTemp, matrixOutCol, matrixInRow);
  matrixOutPre = malloc(matrixOutRow * matrixInCol * sizeof(double));
  for (row = 0; row < matrixOutRow; row++) {
    for (col = 0; col < matrixInCol; col++)
      matrixOutPre[col + row * matrixInCol] = matrixInTemp[col + 2 * row * matrixInCol];
  }
  free(matrixInTemp);
  matrixOutTemp = malloc(matrixOutRow * matrixInCol * sizeof(double));
  matrix_tran(matrixOutPre, matrixOutRow, matrixInCol, matrixOutTemp, matrixInRow, matrixOutCol);
  free(matrixOutPre);
  for (col = 0; col < matrixOutCol; col++) {
    for (row = 0; row < matrixOutRow; row++)
      matrixOut[row + col * matrixOutRow] = matrixOutTemp[row + 2 * col * matrixOutRow];
  }
  free(matrixOutTemp);
  return;
}
```