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

```asm
<kernel_dgema_3_lib4>:
  endbr64
  push   %rbx
  mov    %esi,%ebx
  mov    %ecx,%r10d
  mov    %rdx,%rsi
  lea    -0x3(%rdi),%r11d
  test   %ebx,%ebx
  je     L45
  cmp    $0x1,%ebx
  je     L118
  cmp    $0x2,%ebx
  je     L200
  xor    %eax,%eax
  test   %r11d,%r11d
  jle    L79
  shl    $0x2,%r9d
  shl    $0x2,%r10d
  mov    %r8,%rdx
  mov    %rsi,%rax
  movslq %r9d,%r9
  movslq %r10d,%r10
  xor    %ecx,%ecx
  shl    $0x3,%r9
  shl    $0x3,%r10
  nopl   0x0(%rax)
L107:
  movsd  (%rax),%xmm0
  add    $0x4,%ecx
  movsd  %xmm0,0x8(%rdx)
  movsd  0x8(%rax),%xmm0
  movsd  %xmm0,0x10(%rdx)
  movsd  0x10(%rax),%xmm0
  movsd  %xmm0,0x18(%rdx)
  movsd  0x20(%rax),%xmm0
  movsd  %xmm0,0x28(%rdx)
  movsd  0x28(%rax),%xmm0
  movsd  %xmm0,0x30(%rdx)
  movsd  0x30(%rax),%xmm0
  movsd  %xmm0,0x38(%rdx)
  movsd  0x40(%rax),%xmm0
  movsd  %xmm0,0x48(%rdx)
  movsd  0x48(%rax),%xmm0
  movsd  %xmm0,0x50(%rdx)
  movsd  0x50(%rax),%xmm0
  movsd  %xmm0,0x58(%rdx)
  movsd  0x18(%rax),%xmm0
  add    %r9,%rdx
  movsd  %xmm0,(%rdx)
  movsd  0x38(%rax),%xmm0
  movsd  %xmm0,0x20(%rdx)
  movsd  0x58(%rax),%xmm0
  add    %r10,%rax
  movsd  %xmm0,0x40(%rdx)
  cmp    %ecx,%r11d
  jg     L107
  lea    -0x4(%rdi),%eax
  shr    $0x2,%eax
  lea    0x1(%rax),%edx
  imul   %rdx,%r9
  mov    %rdx,%rax
  imul   %rdx,%r10
  shl    $0x2,%eax
  add    %r9,%r8
  add    %r10,%rsi
L79:
  cmp    %eax,%edi
  jle    L186
  movsd  (%rsi),%xmm0
  lea    0x1(%rax),%edx
  movsd  %xmm0,0x8(%r8)
  movsd  0x20(%rsi),%xmm0
  movsd  %xmm0,0x28(%r8)
  movsd  0x40(%rsi),%xmm0
  movsd  %xmm0,0x48(%r8)
  cmp    %edx,%edi
  je     L186
  movsd  0x8(%rsi),%xmm0
  add    $0x2,%eax
  movsd  %xmm0,0x10(%r8)
  movsd  0x28(%rsi),%xmm0
  movsd  %xmm0,0x30(%r8)
  movsd  0x48(%rsi),%xmm0
  movsd  %xmm0,0x50(%r8)
  cmp    %eax,%edi
  je     L186
  movsd  0x10(%rsi),%xmm0
  movsd  %xmm0,0x18(%r8)
  movsd  0x30(%rsi),%xmm0
  movsd  %xmm0,0x38(%r8)
  movsd  0x50(%rsi),%xmm0
  movsd  %xmm0,0x58(%r8)
L186:
  pop    %rbx
  ret
  nopl   0x0(%rax,%rax,1)
L118:
  test   %r11d,%r11d
  jle    L108
  lea    0x0(,%r9,4),%ebx
  mov    %r8,%rdx
  mov    %rsi,%rax
  xor    %ecx,%ecx
  shl    $0x2,%r10d
  movslq %ebx,%rbx
  movslq %r10d,%r10
  shl    $0x3,%rbx
  shl    $0x3,%r10
  nopl   0x0(%rax,%rax,1)
L215:
  movsd  (%rax),%xmm0
  add    $0x4,%ecx
  movsd  %xmm0,0x18(%rdx)
  movsd  0x20(%rax),%xmm0
  movsd  %xmm0,0x38(%rdx)
  movsd  0x40(%rax),%xmm0
  movsd  %xmm0,0x58(%rdx)
  movsd  0x8(%rax),%xmm0
  add    %rbx,%rdx
  movsd  %xmm0,(%rdx)
  movsd  0x10(%rax),%xmm0
  movsd  %xmm0,0x8(%rdx)
  movsd  0x18(%rax),%xmm0
  movsd  %xmm0,0x10(%rdx)
  movsd  0x28(%rax),%xmm0
  movsd  %xmm0,0x20(%rdx)
  movsd  0x30(%rax),%xmm0
  movsd  %xmm0,0x28(%rdx)
  movsd  0x38(%rax),%xmm0
  movsd  %xmm0,0x30(%rdx)
  movsd  0x48(%rax),%xmm0
  movsd  %xmm0,0x40(%rdx)
  movsd  0x50(%rax),%xmm0
  movsd  %xmm0,0x48(%rdx)
  movsd  0x58(%rax),%xmm0
  add    %r10,%rax
  movsd  %xmm0,0x50(%rdx)
  cmp    %ecx,%r11d
  jg     L215
  lea    -0x4(%rdi),%eax
  shr    $0x2,%eax
  lea    0x1(%rax),%edx
  imul   %rdx,%rbx
  mov    %rdx,%rax
  imul   %rdx,%r10
  shl    $0x2,%eax
  add    %rbx,%r8
  add    %r10,%rsi
L149:
  cmp    %eax,%edi
  jle    L186
  movsd  (%rsi),%xmm0
  lea    0x1(%rax),%edx
  movsd  %xmm0,0x18(%r8)
  movsd  0x20(%rsi),%xmm0
  movsd  %xmm0,0x38(%r8)
  movsd  0x40(%rsi),%xmm0
  movsd  %xmm0,0x58(%r8)
  cmp    %edx,%edi
  je     L186
  lea    0x0(,%r9,4),%ecx
  movsd  0x8(%rsi),%xmm0
  add    $0x2,%eax
  movslq %ecx,%rcx
  lea    (%r8,%rcx,8),%rdx
  movsd  %xmm0,(%rdx)
  movsd  0x28(%rsi),%xmm0
  movsd  %xmm0,0x20(%rdx)
  movsd  0x48(%rsi),%xmm0
  movsd  %xmm0,0x40(%rdx)
  cmp    %eax,%edi
  je     L186
  movsd  0x10(%rsi),%xmm0
  movsd  %xmm0,0x8(%rdx)
  movsd  0x30(%rsi),%xmm0
  movsd  %xmm0,0x28(%rdx)
  movsd  0x50(%rsi),%xmm0
  movsd  %xmm0,0x48(%rdx)
  pop    %rbx
  ret
  nopw   0x0(%rax,%rax,1)
L45:
  test   %r11d,%r11d
  jle    L40
  shl    $0x2,%r10d
  lea    0x0(,%r9,4),%ecx
  mov    %r8,%rdx
  mov    %rsi,%rax
  movslq %r10d,%r10
  movslq %ecx,%rcx
  shl    $0x3,%r10
  shl    $0x3,%rcx
  nopl   0x0(%rax)
L144:
  movsd  (%rax),%xmm0
  add    $0x4,%ebx
  movsd  %xmm0,(%rdx)
  movsd  0x8(%rax),%xmm0
  movsd  %xmm0,0x8(%rdx)
  movsd  0x10(%rax),%xmm0
  movsd  %xmm0,0x10(%rdx)
  movsd  0x18(%rax),%xmm0
  movsd  %xmm0,0x18(%rdx)
  movsd  0x20(%rax),%xmm0
  movsd  %xmm0,0x20(%rdx)
  movsd  0x28(%rax),%xmm0
  movsd  %xmm0,0x28(%rdx)
  movsd  0x30(%rax),%xmm0
  movsd  %xmm0,0x30(%rdx)
  movsd  0x38(%rax),%xmm0
  movsd  %xmm0,0x38(%rdx)
  movsd  0x40(%rax),%xmm0
  movsd  %xmm0,0x40(%rdx)
  movsd  0x48(%rax),%xmm0
  movsd  %xmm0,0x48(%rdx)
  movsd  0x50(%rax),%xmm0
  movsd  %xmm0,0x50(%rdx)
  movsd  0x58(%rax),%xmm0
  add    %r10,%rax
  movsd  %xmm0,0x58(%rdx)
  add    %rcx,%rdx
  cmp    %ebx,%r11d
  jg     L144
  lea    -0x4(%rdi),%ebx
  mov    %r10,%rax
  shr    $0x2,%ebx
  lea    0x1(%rbx),%edx
  imul   %rdx,%rax
  mov    %rdx,%rbx
  imul   %rdx,%rcx
  shl    $0x2,%ebx
  add    %rax,%rsi
  add    %rcx,%r8
L40:
  cmp    %ebx,%edi
  jle    L186
  sub    $0x1,%edi
  sub    %ebx,%edi
  lea    0x8(%r8,%rdi,8),%rax
L76:
  movsd  (%rsi),%xmm0
  add    $0x8,%r8
  add    $0x8,%rsi
  movsd  %xmm0,-0x8(%r8)
  movsd  0x18(%rsi),%xmm0
  movsd  %xmm0,0x18(%r8)
  movsd  0x38(%rsi),%xmm0
  movsd  %xmm0,0x38(%r8)
  cmp    %rax,%r8
  jne    L76
  pop    %rbx
  ret
  nopl   0x0(%rax)
L200:
  test   %r11d,%r11d
  jle    L86
  shl    $0x2,%r10d
  lea    0x0(,%r9,4),%ebx
  mov    %r8,%rdx
  mov    %rsi,%rax
  movslq %r10d,%rcx
  movslq %ebx,%rbx
  xor    %r10d,%r10d
  shl    $0x3,%rbx
  shl    $0x3,%rcx
  nopl   0x0(%rax)
L18:
  movsd  (%rax),%xmm0
  add    $0x4,%r10d
  movsd  %xmm0,0x10(%rdx)
  movsd  0x8(%rax),%xmm0
  movsd  %xmm0,0x18(%rdx)
  movsd  0x20(%rax),%xmm0
  movsd  %xmm0,0x30(%rdx)
  movsd  0x28(%rax),%xmm0
  movsd  %xmm0,0x38(%rdx)
  movsd  0x40(%rax),%xmm0
  movsd  %xmm0,0x50(%rdx)
  movsd  0x48(%rax),%xmm0
  movsd  %xmm0,0x58(%rdx)
  movsd  0x10(%rax),%xmm0
  add    %rbx,%rdx
  movsd  %xmm0,(%rdx)
  movsd  0x18(%rax),%xmm0
  movsd  %xmm0,0x8(%rdx)
  movsd  0x30(%rax),%xmm0
  movsd  %xmm0,0x20(%rdx)
  movsd  0x38(%rax),%xmm0
  movsd  %xmm0,0x28(%rdx)
  movsd  0x50(%rax),%xmm0
  movsd  %xmm0,0x40(%rdx)
  movsd  0x58(%rax),%xmm0
  add    %rcx,%rax
  movsd  %xmm0,0x48(%rdx)
  cmp    %r10d,%r11d
  jg     L18
  lea    -0x4(%rdi),%eax
  shr    $0x2,%eax
  lea    0x1(%rax),%edx
  imul   %rdx,%rbx
  mov    %rdx,%rax
  imul   %rdx,%rcx
  shl    $0x2,%eax
  add    %rbx,%r8
  add    %rcx,%rsi
L176:
  cmp    %eax,%edi
  jle    L186
  movsd  (%rsi),%xmm0
  lea    0x1(%rax),%edx
  movsd  %xmm0,0x10(%r8)
  movsd  0x20(%rsi),%xmm0
  movsd  %xmm0,0x30(%r8)
  movsd  0x40(%rsi),%xmm0
  movsd  %xmm0,0x50(%r8)
  cmp    %edx,%edi
  je     L186
  movsd  0x8(%rsi),%xmm0
  add    $0x2,%eax
  movsd  %xmm0,0x18(%r8)
  movsd  0x28(%rsi),%xmm0
  movsd  %xmm0,0x38(%r8)
  movsd  0x48(%rsi),%xmm0
  movsd  %xmm0,0x58(%r8)
  cmp    %eax,%edi
  je     L186
  lea    0x0(,%r9,4),%ecx
  movsd  0x18(%rsi),%xmm0
  movslq %ecx,%rcx
  lea    (%r8,%rcx,8),%rax
  movsd  %xmm0,(%rax)
  movsd  0x38(%rsi),%xmm0
  movsd  %xmm0,0x20(%rax)
  movsd  0x58(%rsi),%xmm0
  movsd  %xmm0,0x40(%rax)
  pop    %rbx
  ret
L108:
  xor    %eax,%eax
  jmp    L149
L86:
  xor    %eax,%eax
  jmp    L176
```

assistant: ```c
void kernel_dgema_3_lib4(int kmax, int kna, double *A, int sda, double *C, int sdc) {
  const int bs = 4;
  int k;
  if (kna == 0) {
    k = 0;
    for (; k < kmax - 3; k += 4) {
      C[0 + bs * 0] = A[0 + bs * 0];
      C[1 + bs * 0] = A[1 + bs * 0];
      C[2 + bs * 0] = A[2 + bs * 0];
      C[3 + bs * 0] = A[3 + bs * 0];
      C[0 + bs * 1] = A[0 + bs * 1];
      C[1 + bs * 1] = A[1 + bs * 1];
      C[2 + bs * 1] = A[2 + bs * 1];
      C[3 + bs * 1] = A[3 + bs * 1];
      C[0 + bs * 2] = A[0 + bs * 2];
      C[1 + bs * 2] = A[1 + bs * 2];
      C[2 + bs * 2] = A[2 + bs * 2];
      C[3 + bs * 2] = A[3 + bs * 2];
      A += bs * sda;
      C += bs * sdc;
    }
    for (; k < kmax; k++) {
      C[0 + bs * 0] = A[0 + bs * 0];
      C[0 + bs * 1] = A[0 + bs * 1];
      C[0 + bs * 2] = A[0 + bs * 2];
      A += 1;
      C += 1;
    }
    return;
  } else if (kna == 1) {
    k = 0;
    for (; k < kmax - 3; k += 4) {
      C[3 + bs * 0] = A[0 + bs * 0];
      C[3 + bs * 1] = A[0 + bs * 1];
      C[3 + bs * 2] = A[0 + bs * 2];
      C += bs * sdc;
      C[0 + bs * 0] = A[1 + bs * 0];
      C[1 + bs * 0] = A[2 + bs * 0];
      C[2 + bs * 0] = A[3 + bs * 0];
      C[0 + bs * 1] = A[1 + bs * 1];
      C[1 + bs * 1] = A[2 + bs * 1];
      C[2 + bs * 1] = A[3 + bs * 1];
      C[0 + bs * 2] = A[1 + bs * 2];
      C[1 + bs * 2] = A[2 + bs * 2];
      C[2 + bs * 2] = A[3 + bs * 2];
      A += bs * sda;
    }
    if (k >= kmax) {
      return;
    }
    C[3 + bs * 0] = A[0 + bs * 0];
    C[3 + bs * 1] = A[0 + bs * 1];
    C[3 + bs * 2] = A[0 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C += bs * sdc;
    C[0 + bs * 0] = A[1 + bs * 0];
    C[0 + bs * 1] = A[1 + bs * 1];
    C[0 + bs * 2] = A[1 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C[1 + bs * 0] = A[2 + bs * 0];
    C[1 + bs * 1] = A[2 + bs * 1];
    C[1 + bs * 2] = A[2 + bs * 2];
    return;
  } else if (kna == 2) {
    k = 0;
    for (; k < kmax - 3; k += 4) {
      C[2 + bs * 0] = A[0 + bs * 0];
      C[3 + bs * 0] = A[1 + bs * 0];
      C[2 + bs * 1] = A[0 + bs * 1];
      C[3 + bs * 1] = A[1 + bs * 1];
      C[2 + bs * 2] = A[0 + bs * 2];
      C[3 + bs * 2] = A[1 + bs * 2];
      C += bs * sdc;
      C[0 + bs * 0] = A[2 + bs * 0];
      C[1 + bs * 0] = A[3 + bs * 0];
      C[0 + bs * 1] = A[2 + bs * 1];
      C[1 + bs * 1] = A[3 + bs * 1];
      C[0 + bs * 2] = A[2 + bs * 2];
      C[1 + bs * 2] = A[3 + bs * 2];
      A += bs * sda;
    }
    if (k >= kmax) {
      return;
    }
    C[2 + bs * 0] = A[0 + bs * 0];
    C[2 + bs * 1] = A[0 + bs * 1];
    C[2 + bs * 2] = A[0 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C[3 + bs * 0] = A[1 + bs * 0];
    C[3 + bs * 1] = A[1 + bs * 1];
    C[3 + bs * 2] = A[1 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C += bs * sdc;
    C[0 + bs * 0] = A[3 + bs * 0];
    C[0 + bs * 1] = A[3 + bs * 1];
    C[0 + bs * 2] = A[3 + bs * 2];
    return;
  } else {
    k = 0;
    for (; k < kmax - 3; k += 4) {
      C[1 + bs * 0] = A[0 + bs * 0];
      C[2 + bs * 0] = A[1 + bs * 0];
      C[3 + bs * 0] = A[2 + bs * 0];
      C[1 + bs * 1] = A[0 + bs * 1];
      C[2 + bs * 1] = A[1 + bs * 1];
      C[3 + bs * 1] = A[2 + bs * 1];
      C[1 + bs * 2] = A[0 + bs * 2];
      C[2 + bs * 2] = A[1 + bs * 2];
      C[3 + bs * 2] = A[2 + bs * 2];
      C += bs * sdc;
      C[0 + bs * 0] = A[3 + bs * 0];
      C[0 + bs * 1] = A[3 + bs * 1];
      C[0 + bs * 2] = A[3 + bs * 2];
      A += bs * sda;
    }
    if (k >= kmax) {
      return;
    }
    C[1 + bs * 0] = A[0 + bs * 0];
    C[1 + bs * 1] = A[0 + bs * 1];
    C[1 + bs * 2] = A[0 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C[2 + bs * 0] = A[1 + bs * 0];
    C[2 + bs * 1] = A[1 + bs * 1];
    C[2 + bs * 2] = A[1 + bs * 2];
    k++;
    if (k == kmax) {
      return;
    }
    C[3 + bs * 0] = A[2 + bs * 0];
    C[3 + bs * 1] = A[2 + bs * 1];
    C[3 + bs * 2] = A[2 + bs * 2];
    return;
  }
}
```