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

```asm
<sumGAMMAPROT>:
  endbr64
  push   %r15
  mov    %edi,%eax
  mov    %rdx,%r11
  mov    %rsi,%rdi
  push   %r14
  mov    %rcx,%r10
  mov    %r8,%r15
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    0x38(%rsp),%rbx
  movslq 0x40(%rsp),%rdx
  mov    %r9,-0x20(%rsp)
  mov    %rbx,-0x18(%rsp)
  cmp    $0x1,%eax
  je     L117
  cmp    $0x2,%eax
  je     L211
  test   %eax,%eax
  je     L188
  pop    %rbx
  xor    %edi,%edi
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1050 <assert@plt>
L117:
  test   %edx,%edx
  jle    L204
  lea    (%rdx,%rdx,4),%rax
  mov    %r9,%r12
  xor    %r14d,%r14d
  xor    %r13d,%r13d
  shl    $0x4,%rax
  lea    0x288(%rcx),%rbx
  mov    %rax,-0x28(%rsp)
  nopl   0x0(%rax)
L128:
  movzbl (%r12),%esi
  lea    -0x280(%rbx),%rcx
  lea    (%rdi,%r14,1),%rdx
  mov    %r13,%r11
  mov    %rsi,%rax
  lea    (%rsi,%rsi,4),%esi
  shl    $0x2,%esi
  movslq %esi,%rsi
  lea    (%r15,%rsi,8),%r8
  lea    (%rax,%rax,4),%rsi
  shl    $0x5,%rsi
  sub    %r14,%r8
  lea    0x8(%r15,%rsi,1),%rbp
  add    %r15,%rsi
L202:
  cmp    %rdx,%rbp
  je     L165
  cmp    %rcx,%rdx
  je     L165
  movupd -0x8(%rcx),%xmm4
  movupd (%rsi),%xmm0
  mulpd  %xmm4,%xmm0
  movups %xmm0,(%rdx)
  movupd 0x8(%rcx),%xmm5
  movupd 0x10(%rsi),%xmm0
  mulpd  %xmm5,%xmm0
  movups %xmm0,0x10(%rdx)
  movupd 0x18(%rcx),%xmm6
  movupd 0x20(%rsi),%xmm0
  mulpd  %xmm6,%xmm0
  movups %xmm0,0x20(%rdx)
  movupd 0x30(%rsi),%xmm0
  movupd 0x28(%rcx),%xmm7
  mulpd  %xmm7,%xmm0
  movups %xmm0,0x30(%rdx)
  movupd 0x40(%rsi),%xmm0
  movupd 0x38(%rcx),%xmm1
  mulpd  %xmm1,%xmm0
  movups %xmm0,0x40(%rdx)
  movupd 0x50(%rsi),%xmm0
  movupd 0x48(%rcx),%xmm2
  mulpd  %xmm2,%xmm0
  movups %xmm0,0x50(%rdx)
  movupd 0x60(%rsi),%xmm0
  movupd 0x58(%rcx),%xmm3
  mulpd  %xmm3,%xmm0
  movups %xmm0,0x60(%rdx)
  movupd 0x70(%rsi),%xmm0
  movupd 0x68(%rcx),%xmm4
  mulpd  %xmm4,%xmm0
  movups %xmm0,0x70(%rdx)
  movupd 0x80(%rsi),%xmm0
  movupd 0x78(%rcx),%xmm5
  mulpd  %xmm5,%xmm0
  movups %xmm0,0x80(%rdx)
  movupd 0x88(%rcx),%xmm0
  movupd 0x90(%rsi),%xmm6
  mulpd  %xmm6,%xmm0
  movups %xmm0,0x90(%rdx)
L181:
  add    $0xa0,%rcx
  add    $0xa0,%rdx
  sub    $0xa0,%r8
  add    $0x14,%r11
  cmp    %rbx,%rcx
  jne    L202
  add    $0x1,%r12
  add    $0x280,%rbx
  add    $0x50,%r13
  add    $0x280,%r14
  cmp    -0x28(%rsp),%r13
  jne    L128
L204:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L165:
  lea    0x0(,%r11,8),%rax
  lea    0xa0(%rax),%r9
  cs nopw 0x0(%rax,%rax,1)
L113:
  movsd  (%r10,%rax,1),%xmm0
  mulsd  (%r8,%rax,1),%xmm0
  movsd  %xmm0,(%rdi,%rax,1)
  add    $0x8,%rax
  cmp    %r9,%rax
  jne    L113
  jmp    L181
L188:
  test   %edx,%edx
  jle    L204
  movslq %edx,%rax
  mov    %rsi,-0x28(%rsp)
  xor    %r14d,%r14d
  xor    %r12d,%r12d
  mov    %rax,-0x10(%rsp)
  xor    %eax,%eax
  lea    0x280(%rsi),%rbx
  mov    %rax,%rdi
  nopw   0x0(%rax,%rax,1)
L27:
  mov    -0x20(%rsp),%rax
  mov    -0x28(%rsp),%rsi
  mov    %rdi,%r11
  movzbl (%rax,%r12,1),%ecx
  mov    -0x18(%rsp),%rax
  lea    (%rsi,%r14,1),%rdx
  movzbl (%rax,%r12,1),%eax
  mov    %rcx,%r8
  lea    (%rcx,%rcx,4),%rsi
  lea    (%r8,%r8,4),%r8d
  shl    $0x5,%rsi
  movzbl %al,%ecx
  lea    (%rax,%rax,4),%eax
  shl    $0x2,%r8d
  lea    0x8(%r15,%rsi,1),%r13
  lea    (%rcx,%rcx,4),%rcx
  shl    $0x2,%eax
  movslq %r8d,%r8
  add    %r15,%rsi
  shl    $0x5,%rcx
  cltq
  lea    (%r15,%r8,8),%r9
  lea    0x8(%r15,%rcx,1),%rbp
  lea    (%r15,%rax,8),%r8
  add    %r15,%rcx
L205:
  cmp    %rdx,%rbp
  je     L85
  cmp    %rdx,%r13
  je     L85
  movupd (%rcx),%xmm1
  movupd (%rsi),%xmm0
  mulpd  %xmm1,%xmm0
  movups %xmm0,(%rdx)
  movupd 0x10(%rsi),%xmm2
  movupd 0x10(%rcx),%xmm0
  mulpd  %xmm2,%xmm0
  movups %xmm0,0x10(%rdx)
  movupd 0x20(%rsi),%xmm3
  movupd 0x20(%rcx),%xmm0
  mulpd  %xmm3,%xmm0
  movups %xmm0,0x20(%rdx)
  movupd 0x30(%rcx),%xmm0
  movupd 0x30(%rsi),%xmm4
  mulpd  %xmm4,%xmm0
  movups %xmm0,0x30(%rdx)
  movupd 0x40(%rsi),%xmm0
  movupd 0x40(%rcx),%xmm5
  mulpd  %xmm5,%xmm0
  movups %xmm0,0x40(%rdx)
  movupd 0x50(%rsi),%xmm0
  movupd 0x50(%rcx),%xmm6
  mulpd  %xmm6,%xmm0
  movups %xmm0,0x50(%rdx)
  movupd 0x60(%rsi),%xmm0
  movupd 0x60(%rcx),%xmm7
  mulpd  %xmm7,%xmm0
  movups %xmm0,0x60(%rdx)
  movupd 0x70(%rsi),%xmm0
  movupd 0x70(%rcx),%xmm1
  mulpd  %xmm1,%xmm0
  movups %xmm0,0x70(%rdx)
  movupd 0x80(%rsi),%xmm0
  movupd 0x80(%rcx),%xmm2
  mulpd  %xmm2,%xmm0
  movups %xmm0,0x80(%rdx)
  movupd 0x90(%rcx),%xmm0
  movupd 0x90(%rsi),%xmm3
  mulpd  %xmm3,%xmm0
  movups %xmm0,0x90(%rdx)
L218:
  add    $0xa0,%rdx
  add    $0x14,%r11
  cmp    %rdx,%rbx
  jne    L205
  add    $0x1,%r12
  add    $0x280,%rbx
  add    $0x50,%rdi
  add    $0x280,%r14
  cmp    -0x10(%rsp),%r12
  jne    L27
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L85:
  mov    -0x28(%rsp),%rax
  lea    (%rax,%r11,8),%r10
  xor    %eax,%eax
  nopl   0x0(%rax)
L80:
  movsd  (%r8,%rax,1),%xmm0
  mulsd  (%r9,%rax,1),%xmm0
  movsd  %xmm0,(%r10,%rax,1)
  add    $0x8,%rax
  cmp    $0xa0,%rax
  jne    L80
  jmp    L218
L211:
  test   %edx,%edx
  jle    L204
  lea    (%rdx,%rdx,4),%r13
  xor    %ebp,%ebp
  xor    %r12d,%r12d
  mov    $0x50,%ebx
  shl    $0x4,%r13
  lea    0x8(%r11),%r15
  lea    0x8(%rcx),%r14
  nopw   0x0(%rax,%rax,1)
L155:
  lea    (%rdi,%rbp,1),%rdx
  lea    (%r15,%rbp,1),%rcx
  mov    %r12,%r9
  lea    (%r14,%rbp,1),%rsi
  lea    0xa0(%rbp),%r8
L78:
  cmp    %rcx,%rdx
  je     L54
  cmp    %rsi,%rdx
  je     L54
  movupd -0x8(%rsi),%xmm7
  movupd -0x8(%rcx),%xmm0
  mulpd  %xmm7,%xmm0
  movups %xmm0,(%rdx)
  movupd 0x8(%rsi),%xmm1
  movupd 0x8(%rcx),%xmm0
  mulpd  %xmm1,%xmm0
  movups %xmm0,0x10(%rdx)
  movupd 0x18(%rsi),%xmm2
  movupd 0x18(%rcx),%xmm0
  mulpd  %xmm2,%xmm0
  movups %xmm0,0x20(%rdx)
  movupd 0x28(%rcx),%xmm0
  movupd 0x28(%rsi),%xmm3
  mulpd  %xmm3,%xmm0
  movups %xmm0,0x30(%rdx)
  movupd 0x38(%rcx),%xmm0
  movupd 0x38(%rsi),%xmm4
  mulpd  %xmm4,%xmm0
  movups %xmm0,0x40(%rdx)
  movupd 0x48(%rcx),%xmm0
  movupd 0x48(%rsi),%xmm5
  mulpd  %xmm5,%xmm0
  movups %xmm0,0x50(%rdx)
  movupd 0x58(%rcx),%xmm0
  movupd 0x58(%rsi),%xmm6
  mulpd  %xmm6,%xmm0
  movups %xmm0,0x60(%rdx)
  movupd 0x68(%rcx),%xmm0
  movupd 0x68(%rsi),%xmm7
  mulpd  %xmm7,%xmm0
  movups %xmm0,0x70(%rdx)
  movupd 0x78(%rcx),%xmm0
  movupd 0x78(%rsi),%xmm1
  mulpd  %xmm1,%xmm0
  movups %xmm0,0x80(%rdx)
  movupd 0x88(%rcx),%xmm0
  movupd 0x88(%rsi),%xmm2
  mulpd  %xmm2,%xmm0
  movups %xmm0,0x90(%rdx)
L147:
  add    $0x14,%r9
  add    $0xa0,%rdx
  add    $0xa0,%rcx
  add    $0xa0,%rsi
  add    $0xa0,%r8
  cmp    %rbx,%r9
  jne    L78
  add    $0x50,%r12
  add    $0x50,%rbx
  add    $0x280,%rbp
  cmp    %r13,%r12
  jne    L155
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L54:
  lea    0x0(,%r9,8),%rax
  nopl   0x0(%rax,%rax,1)
L24:
  movsd  (%r11,%rax,1),%xmm0
  mulsd  (%r10,%rax,1),%xmm0
  movsd  %xmm0,(%rdi,%rax,1)
  add    $0x8,%rax
  cmp    %rax,%r8
  jne    L24
  jmp    L147
```

assistant: ```c
void sumGAMMAPROT(int tipCase, double *sumtable, double *x1, double *x2, double *tipVector, unsigned char *tipX1, unsigned char *tipX2, int n) {
  int i, l, k;
  double *left, *right, *sum;
  switch (tipCase) {
  case 0:
    for (i = 0; i < n; i++) {
      left = &(tipVector[20 * tipX1[i]]);
      right = &(tipVector[20 * tipX2[i]]);
      for (l = 0; l < 4; l++) {
        sum = &sumtable[i * 80 + l * 20];
        for (k = 0; k < 20; k++)
          sum[k] = left[k] * right[k];
      }
    }
    break;
  case 1:
    for (i = 0; i < n; i++) {
      left = &(tipVector[20 * tipX1[i]]);
      for (l = 0; l < 4; l++) {
        right = &(x2[80 * i + l * 20]);
        sum = &sumtable[i * 80 + l * 20];
        for (k = 0; k < 20; k++)
          sum[k] = left[k] * right[k];
      }
    }
    break;
  case 2:
    for (i = 0; i < n; i++) {
      for (l = 0; l < 4; l++) {
        left = &(x1[80 * i + l * 20]);
        right = &(x2[80 * i + l * 20]);
        sum = &(sumtable[i * 80 + l * 20]);
        for (k = 0; k < 20; k++)
          sum[k] = left[k] * right[k];
      }
    }
    break;
  default:
    assert(0);
  }
}
```