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

```asm
<recorditem>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    %rsi,%rbp
  mov    %rdx,%rbx
  mov    %r9d,0x4(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
L3:
  mov    %r8d,%edx
  imul   (%rdi,%rax,1),%edx
  add    (%rcx,%rax,1),%edx
  mov    %edx,0x10(%rsp,%rax,1)
  mov    %r8d,%edx
  imul   0x0(%rbp,%rax,1),%edx
  add    (%rcx,%rax,1),%edx
  mov    %edx,0x1c(%rsp,%rax,1)
  mov    %r8d,%edx
  imul   (%rbx,%rax,1),%edx
  add    (%rcx,%rax,1),%edx
  mov    %edx,0x28(%rsp,%rax,1)
  add    $0x4,%rax
  cmp    $0xc,%rax
  jne    L3
  cmpl   $0x0,0xa0(%rsp)
  je     L32
  lea    0x34(%rsp),%r15
  lea    0x10(%rsp),%r13
  mov    %r15,%rcx
  mov    %rdi,%rdx
  mov    %r13,%rsi
  mov    %r13,%rdi
  call   <m_xformpt@plt>
  lea    0x40(%rsp),%r14
  lea    0x1c(%rsp),%r12
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  mov    %r12,%rdi
  call   <m_xformpt@plt>
  lea    0x4c(%rsp),%rax
  lea    0x28(%rsp),%rbp
  mov    %rax,0x8(%rsp)
  mov    %rax,%rcx
  mov    %rbx,%rdx
  mov    %rbp,%rsi
  mov    %rbp,%rdi
  call   <m_xformpt@plt>
  mov    0x4(%rsp),%edi
  call   <glBegin@plt>
  mov    %r15,%rdi
  call   <glNormal3dv@plt>
  mov    %r13,%rdi
  call   <glVertex3dv@plt>
  mov    %r14,%rdi
  call   <glNormal3dv@plt>
  mov    %r12,%rdi
  call   <glVertex3dv@plt>
  mov    0x8(%rsp),%rdi
  call   <glNormal3dv@plt>
  mov    %rbp,%rdi
  call   <glVertex3dv@plt>
  mov    $0x0,%eax
  call   <glEnd@plt>
L14:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L23
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L32:
  lea    0x40(%rsp),%r14
  lea    0x1c(%rsp),%rbx
  lea    0x10(%rsp),%r13
  mov    %r14,%rdx
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <diff3@plt>
  lea    0x4c(%rsp),%rbp
  lea    0x28(%rsp),%r12
  mov    %rbp,%rdx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <diff3@plt>
  mov    %rbp,%rdx
  mov    %rbp,%rsi
  mov    %r14,%rdi
  call   <crossprod@plt>
  mov    %rbp,%rdi
  call   <normalize@plt>
  lea    0x34(%rsp),%r14
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r13,%rsi
  mov    %r13,%rdi
  call   <m_xformpt@plt>
  mov    %rbx,%rsi
  mov    %rbx,%rdi
  call   <m_xformptonly@plt>
  mov    %r12,%rsi
  mov    %r12,%rdi
  call   <m_xformptonly@plt>
  mov    0x4(%rsp),%edi
  call   <glBegin@plt>
  mov    %r14,%rdi
  call   <glNormal3dv@plt>
  mov    %r13,%rdi
  call   <glVertex3dv@plt>
  mov    %rbx,%rdi
  call   <glVertex3dv@plt>
  mov    %r12,%rdi
  call   <glVertex3dv@plt>
  mov    $0x0,%eax
  call   <glEnd@plt>
  jmp    L14
L23:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void recorditem(GLdouble *n1, GLdouble *n2, GLdouble *n3, GLdouble center[3], GLdouble radius, GLenum shadeType, int avnormal) {
  GLdouble p1[3], p2[3], p3[3], q0[3], q1[3], n11[3], n22[3], n33[3];
  int i;
  for (i = 0; i < 3; i++) {
    p1[i] = n1[i] * radius + center[i];
    p2[i] = n2[i] * radius + center[i];
    p3[i] = n3[i] * radius + center[i];
  }
  if (avnormal == 0) {
    diff3(p1, p2, q0);
    diff3(p2, p3, q1);
    crossprod(q0, q1, q1);
    normalize(q1);
    m_xformpt(p1, p1, q1, n11);
    m_xformptonly(p2, p2);
    m_xformptonly(p3, p3);
    glBegin(shadeType);
    glNormal3dv(n11);
    glVertex3dv(p1);
    glVertex3dv(p2);
    glVertex3dv(p3);
    glEnd();
    return;
  }
  m_xformpt(p1, p1, n1, n11);
  m_xformpt(p2, p2, n2, n22);
  m_xformpt(p3, p3, n3, n33);
  glBegin(shadeType);
  glNormal3dv(n11);
  glVertex3dv(p1);
  glNormal3dv(n22);
  glVertex3dv(p2);
  glNormal3dv(n33);
  glVertex3dv(p3);
  glEnd();
}
```