user: 下面的汇编指令对应的C源代码是什么：

```asm
<matprod_trans2_sub_xrows>:
  endbr64
  push   %r15
  mov    %rsi,%r15
  push   %r14
  mov    %rdx,%r14
  push   %r13
  mov    %r8d,%r13d
  push   %r12
  mov    %ecx,%r12d
  push   %rbp
  mov    %rdi,%rbp
  mov    $0x1,%edi
  push   %rbx
  sub    $0x38,%rsp
  mov    %r9d,0x4(%rsp)
  call   <assert@plt>
  mov    $0x1,%edi
  call   <assert@plt>
  mov    $0x1,%edi
  call   <assert@plt>
  xor    %edi,%edi
  cmpl   $0x3c0,0x70(%rsp)
  setle  %dil
  call   <assert@plt>
  cmp    $0x20,%r13d
  mov    0x4(%rsp),%r9d
  jle    L54
  mov    $0x7800,%eax
  cltd
  idivl  0x70(%rsp)
  and    $0xfffffff8,%eax
  mov    %eax,%ebx
  cmp    %eax,%r13d
  jle    L54
  lea    (%rax,%rax,1),%eax
  mov    %eax,0xc(%rsp)
  cmp    %eax,%r13d
  jle    L9
  movslq %ebx,%rax
  movslq %r12d,%rsi
  movslq %r9d,%rdx
  mov    %r13d,%r10d
  mov    %rsi,0x20(%rsp)
  imul   %rax,%rsi
  mov    %r13d,%r8d
  mov    %r14,%r13
  imul   %rdx,%rax
  mov    %rdx,0x28(%rsp)
  mov    %r10d,%r14d
  lea    0x0(,%rsi,8),%rsi
  shl    $0x3,%rax
  mov    %rsi,0x10(%rsp)
  mov    %r15,%rsi
  mov    %ebx,%r15d
  mov    %rax,0x18(%rsp)
  mov    %rsi,%rbx
  xor    %eax,%eax
  cs nopw 0x0(%rax,%rax,1)
L49:
  push   0x80(%rsp)
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  mov    %r12d,%ecx
  push   $0x0
  mov    %r13,%rdx
  sub    %r15d,%r14d
  push   %rax
  push   %r15
  mov    0x98(%rsp),%eax
  push   %rax
  mov    0x98(%rsp),%eax
  push   %rax
  mov    %r9d,0x38(%rsp)
  mov    %r8d,0x34(%rsp)
  call   <matprod_trans2_sub_xrowscols@plt>
  add    0x40(%rsp),%rbp
  add    0x48(%rsp),%rbx
  add    $0x30,%rsp
  cmp    0xc(%rsp),%r14d
  mov    $0x1,%eax
  mov    0x4(%rsp),%r8d
  mov    0x8(%rsp),%r9d
  jg     L49
  mov    %rbx,%rax
  mov    %r14d,%r10d
  mov    %r15d,%ebx
  mov    %r13,%r14
  mov    %rax,%r15
  mov    %r8d,%r13d
  cmp    %r10d,%ebx
  jl     L50
L21:
  push   0x80(%rsp)
  push   $0x1
  push   $0x1
  push   %r10
L30:
  mov    0x98(%rsp),%eax
  mov    %r13d,%r8d
  mov    %r12d,%ecx
  mov    %r14,%rdx
  mov    %r15,%rsi
  mov    %rbp,%rdi
  push   %rax
  mov    0x98(%rsp),%eax
  push   %rax
  call   <matprod_trans2_sub_xrowscols@plt>
  add    $0x30,%rsp
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L54:
  push   0x80(%rsp)
  push   $0x1
  push   $0x0
  push   %r13
  jmp    L30
  nop
L9:
  movslq %r12d,%rsi
  mov    %r13d,%r10d
  xor    %eax,%eax
  mov    %rsi,0x20(%rsp)
  movslq %r9d,%rsi
  mov    %rsi,0x28(%rsp)
L39:
  lea    0x1(%r10),%edx
  mov    %r10d,0x8(%rsp)
  mov    %r15,%rsi
  mov    %rbp,%rdi
  mov    %edx,%ebx
  push   0x80(%rsp)
  mov    %r13d,%r8d
  mov    %r12d,%ecx
  shr    $0x1f,%ebx
  push   $0x0
  add    %edx,%ebx
  push   %rax
  mov    %r14,%rdx
  sar    %ebx
  and    $0xfffffffc,%ebx
  push   %rbx
  mov    0x98(%rsp),%eax
  push   %rax
  mov    0x98(%rsp),%eax
  push   %rax
  mov    %r9d,0x34(%rsp)
  call   <matprod_trans2_sub_xrowscols@plt>
  mov    0x50(%rsp),%rax
  movslq %ebx,%rdx
  mov    0x38(%rsp),%r10d
  imul   %rdx,%rax
  sub    %ebx,%r10d
  lea    0x0(%rbp,%rax,8),%rbp
  mov    0x58(%rsp),%rax
  add    $0x30,%rsp
  mov    0x4(%rsp),%r9d
  imul   %rdx,%rax
  lea    (%r15,%rax,8),%r15
  jmp    L21
  nopw   0x0(%rax,%rax,1)
L50:
  mov    $0x1,%eax
  jmp    L39
```

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