user: 请从给定的汇编指令推导出C源代码：

```asm
<MultiplyData>:
  endbr64
  sub    $0x53,%r8d
  cmp    $0x22,%r8b
  ja     L51
  mov    %rdi,%rax
  mov    %rdx,%rdi
  movzbl %r8b,%r8d
  lea    D16(%rip),%r10
  movslq (%r10,%r8,4),%rdx
  add    %r10,%rdx
  notrack jmp *%rdx
  test   %r9d,%r9d
  jle    L5
  mov    %rax,%r8
  lea    -0x1(%r9),%edx
  lea    0x2(%rax,%rdx,2),%r10
  mov    $0x0,%r9d
L118:
  mov    %r9d,%eax
  cltd
  idiv   %esi
  movslq %eax,%rdx
  movzwl (%r8),%eax
  imul   (%rdi,%rdx,2),%ax
  mov    %ax,(%r8)
  add    $0x2,%r8
  add    %ecx,%r9d
  cmp    %r10,%r8
  jne    L118
  ret
L5:
  ret
  test   %r9d,%r9d
  jle    L49
  mov    %rax,%r8
  lea    -0x1(%r9),%edx
  lea    0x2(%rax,%rdx,2),%r10
  mov    $0x0,%r9d
L0:
  mov    %r9d,%eax
  cltd
  idiv   %esi
  movslq %eax,%rdx
  movzwl (%r8),%eax
  imul   (%rdi,%rdx,2),%ax
  mov    %ax,(%r8)
  add    $0x2,%r8
  add    %ecx,%r9d
  cmp    %r10,%r8
  jne    L0
  ret
L49:
  ret
  test   %r9d,%r9d
  jle    L116
  mov    %rax,%r8
  lea    -0x1(%r9),%edx
  lea    0x4(%rax,%rdx,4),%r10
  mov    $0x0,%r9d
L132:
  mov    %r9d,%eax
  cltd
  idiv   %esi
  cltq
  movss  (%r8),%xmm0
  mulss  (%rdi,%rax,4),%xmm0
  movss  %xmm0,(%r8)
  add    $0x4,%r8
  add    %ecx,%r9d
  cmp    %r10,%r8
  jne    L132
  ret
L116:
  ret
  test   %r9d,%r9d
  jle    L111
  mov    %rax,%r8
  lea    -0x1(%r9),%edx
  lea    0x8(%rax,%rdx,8),%r10
  mov    $0x0,%r9d
L3:
  mov    %r9d,%eax
  cltd
  idiv   %esi
  cltq
  movsd  (%r8),%xmm0
  mulsd  (%rdi,%rax,8),%xmm0
  movsd  %xmm0,(%r8)
  add    $0x8,%r8
  add    %ecx,%r9d
  cmp    %r10,%r8
  jne    L3
  ret
L111:
  ret
  test   %r9d,%r9d
  jle    L112
  mov    %rax,%r8
  lea    -0x1(%r9),%edx
  lea    0x1(%rax,%rdx,1),%r10
  mov    $0x0,%r9d
L10:
  mov    %r9d,%eax
  cltd
  idiv   %esi
  movslq %eax,%rdx
  movzbl (%r8),%eax
  mulb   (%rdi,%rdx,1)
  mov    %al,(%r8)
  add    $0x1,%r8
  add    %ecx,%r9d
  cmp    %r10,%r8
  jne    L10
  ret
L112:
  ret
  test   %r9d,%r9d
  jle    L17
  mov    %rax,%r8
  lea    -0x1(%r9),%edx
  lea    0x4(%rax,%rdx,4),%r10
  mov    $0x0,%r9d
L52:
  mov    %r9d,%eax
  cltd
  idiv   %esi
  movslq %eax,%rdx
  mov    (%r8),%eax
  imul   (%rdi,%rdx,4),%eax
  mov    %eax,(%r8)
  add    $0x4,%r8
  add    %ecx,%r9d
  cmp    %r10,%r8
  jne    L52
  ret
L17:
  ret
  test   %r9d,%r9d
  jle    L135
  mov    %rax,%r8
  lea    -0x1(%r9),%edx
  lea    0x4(%rax,%rdx,4),%r10
  mov    $0x0,%r9d
L149:
  mov    %r9d,%eax
  cltd
  idiv   %esi
  movslq %eax,%rdx
  mov    (%r8),%eax
  imul   (%rdi,%rdx,4),%eax
  mov    %eax,(%r8)
  add    $0x4,%r8
  add    %ecx,%r9d
  cmp    %r8,%r10
  jne    L149
  ret
L135:
  ret
L51:
  sub    $0x8,%rsp
  lea    D12(%rip),%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  call   <abort@plt>
  add    $0x8,%rsp
  ret
  ret
```

tool_calls: name: read_data
arguments: data_tag: D12
type_guessed: string

tool: D12: 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;
  }
}
```