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

```asm
<matprod_trans2_sub_xrows>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  mov    %rdx,0x10(%rsp)
  mov    %ecx,0xc(%rsp)
  mov    %r8d,%r14d
  mov    %r9d,0x18(%rsp)
  mov    0x70(%rsp),%r15d
  mov    $0x1,%edi
  call   <assert@plt>
  mov    $0x1,%edi
  call   <assert@plt>
  mov    $0x1,%edi
  call   <assert@plt>
  cmp    $0x3c0,%r15d
  setle  %dil
  movzbl %dil,%edi
  call   <assert@plt>
  cmp    $0x20,%r14d
  jle    L65
  mov    $0x7800,%eax
  cltd
  idiv   %r15d
  and    $0xfffffff8,%eax
  mov    %eax,%r12d
  cmp    %eax,%r14d
  jle    L65
  lea    (%rax,%rax,1),%eax
  mov    %eax,0x1c(%rsp)
  mov    %r14d,%r13d
  mov    $0x0,%ecx
  cmp    %eax,%r14d
  jle    L43
  movslq %r12d,%rax
  movslq 0xc(%rsp),%rdx
  imul   %rax,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    %rcx,0x20(%rsp)
  movslq 0x18(%rsp),%rdx
  imul   %rdx,%rax
  shl    $0x3,%rax
  mov    %rax,0x28(%rsp)
  mov    $0x0,%eax
L17:
  push   0x80(%rsp)
  push   $0x0
  push   %rax
  push   %r12
  mov    0x98(%rsp),%eax
  push   %rax
  push   %r15
  mov    0x48(%rsp),%r9d
  mov    %r14d,%r8d
  mov    0x3c(%rsp),%ecx
  mov    0x40(%rsp),%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <matprod_trans2_sub_xrowscols@plt>
  add    0x50(%rsp),%rbx
  add    0x58(%rsp),%rbp
  sub    %r12d,%r13d
  mov    $0x1,%eax
  add    $0x30,%rsp
  cmp    0x1c(%rsp),%r13d
  jg     L17
  cmp    %r13d,%r12d
  jl     L37
L61:
  push   0x80(%rsp)
  push   $0x1
  push   $0x1
  push   %r13
  mov    0x98(%rsp),%eax
  push   %rax
  push   %r15
  mov    0x48(%rsp),%r9d
  mov    %r14d,%r8d
  mov    0x3c(%rsp),%ecx
  mov    0x40(%rsp),%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <matprod_trans2_sub_xrowscols@plt>
  add    $0x30,%rsp
L8:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L65:
  push   0x80(%rsp)
  push   $0x1
  push   $0x0
  push   %r14
  mov    0x98(%rsp),%eax
  push   %rax
  push   %r15
  mov    0x48(%rsp),%r9d
  mov    %r14d,%r8d
  mov    0x3c(%rsp),%ecx
  mov    0x40(%rsp),%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <matprod_trans2_sub_xrowscols@plt>
  add    $0x30,%rsp
  jmp    L8
L37:
  mov    $0x1,%ecx
L43:
  lea    0x1(%r13),%edx
  mov    %edx,%eax
  shr    $0x1f,%eax
  add    %edx,%eax
  sar    %eax
  and    $0xfffffffc,%eax
  mov    %eax,%r12d
  push   0x80(%rsp)
  push   $0x0
  push   %rcx
  push   %rax
  mov    0x98(%rsp),%eax
  push   %rax
  push   %r15
  mov    0x48(%rsp),%r9d
  mov    %r14d,%r8d
  mov    0x3c(%rsp),%ecx
  mov    0x40(%rsp),%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <matprod_trans2_sub_xrowscols@plt>
  movslq %r12d,%rdx
  movslq 0x3c(%rsp),%rax
  imul   %rdx,%rax
  lea    (%rbx,%rax,8),%rbx
  movslq 0x48(%rsp),%rax
  imul   %rdx,%rax
  lea    0x0(%rbp,%rax,8),%rbp
  sub    %r12d,%r13d
  add    $0x30,%rsp
  jmp    L61
```

assistant: ```c
void matprod_trans2_sub_xrows(double *restrict x, double *restrict y, double *restrict z, int n, int k, int m, int xrows, int yrows, double *sym) {
  assert(((uintptr_t)(x) & (1 - 1)) == 0);
  assert(((uintptr_t)(y) & (1 - 1)) == 0);
  assert(((uintptr_t)(z) & (1 - 1)) == 0);
  x = (x);
  y = (y);
  z = (z);
  assert(xrows <= (1024 - 64));
  int chunk;
  if (k <= 32 || k <= (chunk = (32 * (1024 - 64) / xrows) & ~7)) {
    matprod_trans2_sub_xrowscols(x, y, z, n, k, m, xrows, yrows, k, 0, 1, sym);
    return;
  }
  int xcols = k;
  int add = 0;
  while (xcols > 2 * chunk) {
    matprod_trans2_sub_xrowscols(x, y, z, n, k, m, xrows, yrows, chunk, add, 0, sym);
    x += (size_t)chunk * n;
    y += (size_t)chunk * m;
    xcols -= chunk;
    add = 1;
  }
  if (xcols > chunk) {
    int nc = ((xcols + 1) / 2) & ~3;
    matprod_trans2_sub_xrowscols(x, y, z, n, k, m, xrows, yrows, nc, add, 0, sym);
    x += (size_t)nc * n;
    y += (size_t)nc * m;
    xcols -= nc;
    add = 1;
  }
  matprod_trans2_sub_xrowscols(x, y, z, n, k, m, xrows, yrows, xcols, add, 1, sym);
}
```