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

```asm
<MultiplyData>:
  endbr64
  sub    $0x53,%r8d
  cmp    $0x22,%r8b
  ja     L98
  mov    %ecx,%r10d
  movzbl %r8b,%r8d
  lea    D3(%rip),%rcx
  mov    %rdi,%rax
  mov    %rdx,%rdi
  movslq (%rcx,%r8,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  nopl   0x0(%rax)
  ret
  nopl   0x0(%rax)
L98:
  sub    $0x8,%rsp
  lea    D14(%rip),%rdi
  call   <printf@plt>
  xor    %eax,%eax
  add    $0x8,%rsp
  jmp    1060 <abort@plt>
  nopl   0x0(%rax,%rax,1)
  test   %r9d,%r9d
  jle    L106
  mov    %rax,%rcx
  lea    -0x1(%r9),%eax
  xor    %r8d,%r8d
  lea    0x4(%rcx,%rax,4),%r9
L114:
  mov    %r8d,%eax
  add    $0x4,%rcx
  add    %r10d,%r8d
  cltd
  idiv   %esi
  movslq %eax,%rdx
  mov    -0x4(%rcx),%eax
  imul   (%rdi,%rdx,4),%eax
  mov    %eax,-0x4(%rcx)
  cmp    %rcx,%r9
  jne    L114
  ret
  test   %r9d,%r9d
  jle    L148
  mov    %rax,%rcx
  lea    -0x1(%r9),%eax
  xor    %r8d,%r8d
  lea    0x8(%rcx,%rax,8),%r9
  nopl   0x0(%rax,%rax,1)
L23:
  mov    %r8d,%eax
  movsd  (%rcx),%xmm0
  add    $0x8,%rcx
  add    %r10d,%r8d
  cltd
  idiv   %esi
  cltq
  mulsd  (%rdi,%rax,8),%xmm0
  movsd  %xmm0,-0x8(%rcx)
  cmp    %rcx,%r9
  jne    L23
  ret
  nopl   0x0(%rax,%rax,1)
  test   %r9d,%r9d
  jle    L89
  mov    %rax,%rcx
  lea    -0x1(%r9),%eax
  xor    %r8d,%r8d
  lea    0x4(%rcx,%rax,4),%r9
L43:
  mov    %r8d,%eax
  add    $0x4,%rcx
  add    %r10d,%r8d
  cltd
  idiv   %esi
  movslq %eax,%rdx
  mov    -0x4(%rcx),%eax
  imul   (%rdi,%rdx,4),%eax
  mov    %eax,-0x4(%rcx)
  cmp    %rcx,%r9
  jne    L43
  ret
  test   %r9d,%r9d
  jle    L48
  mov    %rax,%rcx
  lea    -0x1(%r9),%eax
  xor    %r8d,%r8d
  lea    0x1(%rcx,%rax,1),%r9
  nopl   0x0(%rax,%rax,1)
L68:
  mov    %r8d,%eax
  add    $0x1,%rcx
  add    %r10d,%r8d
  cltd
  idiv   %esi
  movslq %eax,%rdx
  movzbl -0x1(%rcx),%eax
  mulb   (%rdi,%rdx,1)
  mov    %al,-0x1(%rcx)
  cmp    %rcx,%r9
  jne    L68
  ret
  test   %r9d,%r9d
  jle    L34
  mov    %rax,%rcx
  lea    -0x1(%r9),%eax
  xor    %r8d,%r8d
  lea    0x2(%rcx,%rax,2),%r9
  nopl   0x0(%rax,%rax,1)
L56:
  mov    %r8d,%eax
  add    $0x2,%rcx
  add    %r10d,%r8d
  cltd
  idiv   %esi
  movslq %eax,%rdx
  movzwl -0x2(%rcx),%eax
  imul   (%rdi,%rdx,2),%ax
  mov    %ax,-0x2(%rcx)
  cmp    %r9,%rcx
  jne    L56
  ret
  nopl   0x0(%rax,%rax,1)
  test   %r9d,%r9d
  jle    L147
  mov    %rax,%rcx
  lea    -0x1(%r9),%eax
  xor    %r8d,%r8d
  lea    0x2(%rcx,%rax,2),%r9
L61:
  mov    %r8d,%eax
  add    $0x2,%rcx
  add    %r10d,%r8d
  cltd
  idiv   %esi
  movslq %eax,%rdx
  movzwl -0x2(%rcx),%eax
  imul   (%rdi,%rdx,2),%ax
  mov    %ax,-0x2(%rcx)
  cmp    %r9,%rcx
  jne    L61
  ret
  nopl   0x0(%rax,%rax,1)
  test   %r9d,%r9d
  jle    L120
  mov    %rax,%rcx
  lea    -0x1(%r9),%eax
  xor    %r8d,%r8d
  lea    0x4(%rcx,%rax,4),%r9
  nopl   0x0(%rax)
L136:
  mov    %r8d,%eax
  movss  (%rcx),%xmm0
  add    $0x4,%rcx
  add    %r10d,%r8d
  cltd
  idiv   %esi
  cltq
  mulss  (%rdi,%rax,4),%xmm0
  movss  %xmm0,-0x4(%rcx)
  cmp    %rcx,%r9
  jne    L136
  ret
  nopl   0x0(%rax,%rax,1)
L106:
  ret
  nopl   0x0(%rax)
L120:
  ret
  nopl   0x0(%rax)
L147:
  ret
  nopl   0x0(%rax)
L34:
  ret
  nopl   0x0(%rax)
L48:
  ret
  nopl   0x0(%rax)
L89:
  ret
  nopl   0x0(%rax)
L148:
  ret
```

tool_calls: name: parse_data
arguments: tag: D14
type_guessed: string

tool: D14: Unexpected bad type error in MultiplyData


assistant: ```c
void MultiplyData(void *A, int spfA, void *B, int spfB, char type, int n) {
  int i;
  switch (type) {
  case 'n':
    break;
  case 'c':
    for (i = 0; i < n; i++) {
      ((char *)A)[i] *= ((char *)B)[i * spfB / spfA];
    }
    break;
  case 'S':
  case 'i':
    for (i = 0; i < n; i++) {
      ((int *)A)[i] *= ((int *)B)[i * spfB / spfA];
    }
    break;
  case 's':
    for (i = 0; i < n; i++) {
      ((short *)A)[i] *= ((short *)B)[i * spfB / spfA];
    }
    break;
  case 'u':
    for (i = 0; i < n; i++) {
      ((unsigned short *)A)[i] *= ((unsigned short *)B)[i * spfB / spfA];
    }
    break;
  case 'U':
    for (i = 0; i < n; i++) {
      ((unsigned *)A)[i] *= ((unsigned *)B)[i * spfB / spfA];
    }
    break;
  case 'f':
    for (i = 0; i < n; i++) {
      ((float *)A)[i] *= ((float *)B)[i * spfB / spfA];
    }
    break;
  case 'd':
    for (i = 0; i < n; i++) {
      ((double *)A)[i] *= ((double *)B)[i * spfB / spfA];
    }
    break;
  default:
    printf("Unexpected bad type error in MultiplyData\n");
    abort();
    break;
  }
}
```