user: Demonstrate the C code that generates the assembly output below:

```asm
<cpu_gemm>:
  endbr64
  push   %r15
  mov    %edx,%r10d
  mov    %ecx,%r11d
  push   %r14
  push   %r13
  mov    %esi,%r13d
  push   %r12
  mov    %edi,%r12d
  push   %rbp
  push   %rbx
  mov    0x38(%rsp),%eax
  mov    0x48(%rsp),%r15d
  mov    0x50(%rsp),%rbx
  mov    0x58(%rsp),%edi
  mov    %eax,-0x14(%rsp)
  mov    0x40(%rsp),%rax
  mov    %rax,-0x10(%rsp)
  test   %edx,%edx
  jle    L18
  xor    %esi,%esi
  lea    -0x1(%r11),%r14d
  lea    0x4(%rbx),%rbp
  xor    %ecx,%ecx
  nopw   0x0(%rax,%rax,1)
L73:
  test   %r11d,%r11d
  jle    L17
  movslq %esi,%rdx
  lea    (%rbx,%rdx,4),%rax
  add    %r14,%rdx
  lea    0x0(%rbp,%rdx,4),%rdx
  nopl   0x0(%rax)
L65:
  movss  (%rax),%xmm2
  add    $0x4,%rax
  mulss  %xmm1,%xmm2
  movss  %xmm2,-0x4(%rax)
  cmp    %rdx,%rax
  jne    L65
L17:
  add    $0x1,%ecx
  add    %edi,%esi
  cmp    %ecx,%r10d
  jne    L73
L18:
  mov    %r12d,%eax
  or     %r13d,%eax
  je     L4
  test   %r12d,%r12d
  je     L88
  test   %r13d,%r13d
  jne    L58
  mov    -0x10(%rsp),%rax
  mov    %edi,0x58(%rsp)
  mov    %r11d,%ecx
  mov    %r12d,%edi
  mov    %rbx,0x50(%rsp)
  mov    %r10d,%edx
  xor    %esi,%esi
  mov    %rax,0x40(%rsp)
  mov    -0x14(%rsp),%eax
  mov    %r15d,0x48(%rsp)
  mov    %eax,0x38(%rsp)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10b0 <cpu_gemm_tn@plt>
L58:
  test   %r12d,%r12d
  jne    L44
L88:
  test   %r13d,%r13d
  je     L44
  mov    -0x10(%rsp),%rax
  mov    %edi,0x58(%rsp)
  mov    %r13d,%esi
  mov    %r11d,%ecx
  mov    %rbx,0x50(%rsp)
  mov    %r10d,%edx
  xor    %edi,%edi
  mov    %rax,0x40(%rsp)
  mov    -0x14(%rsp),%eax
  mov    %r15d,0x48(%rsp)
  mov    %eax,0x38(%rsp)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1080 <cpu_gemm_nt@plt>
L4:
  mov    -0x10(%rsp),%rax
  mov    %edi,0x58(%rsp)
  mov    %r11d,%ecx
  mov    %r10d,%edx
  mov    %rbx,0x50(%rsp)
  xor    %esi,%esi
  xor    %edi,%edi
  mov    %rax,0x40(%rsp)
  mov    -0x14(%rsp),%eax
  mov    %r15d,0x48(%rsp)
  mov    %eax,0x38(%rsp)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    10a0 <cpu_gemm_nn@plt>
L44:
  mov    -0x10(%rsp),%rax
  mov    %edi,0x58(%rsp)
  mov    %r13d,%esi
  mov    %r12d,%edi
  mov    %rbx,0x50(%rsp)
  mov    %r11d,%ecx
  mov    %r10d,%edx
  mov    %rax,0x40(%rsp)
  mov    -0x14(%rsp),%eax
  mov    %r15d,0x48(%rsp)
  mov    %eax,0x38(%rsp)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1090 <cpu_gemm_tt@plt>
```

assistant: ```c
void cpu_gemm(int TA, int TB, int M, int N, int K, float ALPHA, float *A, int lda, float *B, int ldb, float BETA, float *C, int ldc) {
  int i, j;
  for (i = 0; i < M; ++i) {
    for (j = 0; j < N; ++j) {
      C[i * ldc + j] *= BETA;
    }
  }
  if (!TA && !TB)
    cpu_gemm_nn(TA, TB, M, N, K, ALPHA, A, lda, B, ldb, BETA, C, ldc);
  else if (TA && !TB)
    cpu_gemm_tn(TA, TB, M, N, K, ALPHA, A, lda, B, ldb, BETA, C, ldc);
  else if (!TA && TB)
    cpu_gemm_nt(TA, TB, M, N, K, ALPHA, A, lda, B, ldb, BETA, C, ldc);
  else
    cpu_gemm_tt(TA, TB, M, N, K, ALPHA, A, lda, B, ldb, BETA, C, ldc);
}
```