user: What would the C source look like for the assembly code provided here:

```asm
<vector_madd>:
  endbr64
  mov    %r8d,%r10d
  mov    %rsi,%r9
  push   %rbx
  mov    %rdx,%rsi
  and    $0x3,%r10d
  mov    %rcx,%rdx
  and    $0xfffffffc,%r8d
  je     L87
  lea    0x3f(%rcx),%rax
  lea    0x3f(%rsi),%rcx
  sub    %rdi,%rax
  lea    -0x1(%r8),%r11d
  cmp    $0x7e,%rax
  seta   %al
  sub    %rdi,%rcx
  cmp    $0x7e,%rcx
  seta   %cl
  and    %ecx,%eax
  lea    0x3f(%r9),%rcx
  sub    %rdi,%rcx
  cmp    $0x7e,%rcx
  seta   %cl
  test   %cl,%al
  je     L75
  cmp    $0xb,%r11d
  jbe    L75
  shr    $0x2,%r11d
  movdqa D25(%rip),%xmm2
  xor    %eax,%eax
  xor    %ecx,%ecx
  add    $0x1,%r11d
  movdqa D15(%rip),%xmm4
  movdqa D9(%rip),%xmm3
  mov    %r11d,%ebx
  shr    $0x2,%ebx
  nopl   0x0(%rax,%rax,1)
L106:
  movdqu 0x10(%r9,%rax,1),%xmm0
  movdqu 0x10(%rsi,%rax,1),%xmm5
  movdqa %xmm2,%xmm1
  add    $0x1,%ecx
  movdqu 0x10(%rsi,%rax,1),%xmm7
  movdqu (%rsi,%rax,1),%xmm9
  paddd  %xmm4,%xmm2
  paddd  %xmm3,%xmm1
  movdqu 0x10(%r9,%rax,1),%xmm6
  psrlq  $0x20,%xmm5
  psrlq  $0x20,%xmm0
  movdqu 0x30(%rsi,%rax,1),%xmm8
  pmuludq %xmm5,%xmm0
  movdqu 0x20(%rsi,%rax,1),%xmm5
  psrlq  $0x20,%xmm9
  pmuludq %xmm7,%xmm6
  movdqu 0x10(%rdx,%rax,1),%xmm7
  psrlq  $0x20,%xmm8
  pshufd $0x8,%xmm0,%xmm0
  pshufd $0x8,%xmm6,%xmm6
  punpckldq %xmm0,%xmm6
  movdqu 0x20(%r9,%rax,1),%xmm0
  paddd  %xmm7,%xmm6
  movdqu 0x20(%r9,%rax,1),%xmm7
  psrlq  $0x20,%xmm0
  pmuludq %xmm5,%xmm7
  movdqu 0x20(%rsi,%rax,1),%xmm5
  psrlq  $0x20,%xmm5
  pmuludq %xmm5,%xmm0
  movdqu 0x20(%rdx,%rax,1),%xmm5
  pshufd $0x8,%xmm7,%xmm7
  pshufd $0x8,%xmm0,%xmm0
  punpckldq %xmm0,%xmm7
  movdqu 0x30(%rsi,%rax,1),%xmm0
  paddd  %xmm5,%xmm7
  movdqu 0x30(%r9,%rax,1),%xmm5
  pmuludq %xmm0,%xmm5
  movdqu 0x30(%r9,%rax,1),%xmm0
  psrlq  $0x20,%xmm0
  pmuludq %xmm8,%xmm0
  movdqu (%r9,%rax,1),%xmm8
  pshufd $0x8,%xmm5,%xmm5
  pshufd $0x8,%xmm0,%xmm0
  punpckldq %xmm0,%xmm5
  movdqu 0x30(%rdx,%rax,1),%xmm0
  paddd  %xmm0,%xmm5
  movdqu (%rsi,%rax,1),%xmm0
  pmuludq %xmm0,%xmm8
  movdqu (%r9,%rax,1),%xmm0
  psrlq  $0x20,%xmm0
  pmuludq %xmm9,%xmm0
  pshufd $0x8,%xmm8,%xmm8
  pshufd $0x8,%xmm0,%xmm0
  punpckldq %xmm0,%xmm8
  movdqu (%rdx,%rax,1),%xmm0
  movups %xmm6,0x10(%rdi,%rax,1)
  movups %xmm7,0x20(%rdi,%rax,1)
  paddd  %xmm8,%xmm0
  movups %xmm5,0x30(%rdi,%rax,1)
  movups %xmm0,(%rdi,%rax,1)
  add    $0x40,%rax
  cmp    %ecx,%ebx
  ja     L106
  mov    %r11d,%ebx
  pshufd $0xff,%xmm1,%xmm1
  and    $0xfffffffc,%ebx
  movd   %xmm1,%eax
  lea    0x0(,%rbx,4),%ecx
  cmp    %ebx,%r11d
  je     L91
  mov    %ecx,%r11d
  mov    (%r9,%r11,4),%eax
  imul   (%rsi,%r11,4),%eax
  add    (%rdx,%r11,4),%eax
  mov    %eax,(%rdi,%r11,4)
  lea    0x1(%rcx),%r11d
  mov    (%rsi,%r11,4),%eax
  imul   (%r9,%r11,4),%eax
  add    (%rdx,%r11,4),%eax
  mov    %eax,(%rdi,%r11,4)
  lea    0x2(%rcx),%eax
  mov    (%r9,%rax,4),%r11d
  imul   (%rsi,%rax,4),%r11d
  add    (%rdx,%rax,4),%r11d
  mov    %r11d,(%rdi,%rax,4)
  lea    0x3(%rcx),%r11d
  mov    (%r9,%r11,4),%eax
  imul   (%rsi,%r11,4),%eax
  add    (%rdx,%r11,4),%eax
  mov    %eax,(%rdi,%r11,4)
  lea    0x4(%rcx),%eax
  cmp    %eax,%r8d
  jbe    L91
  mov    (%r9,%rax,4),%r11d
  imul   (%rsi,%rax,4),%r11d
  add    (%rdx,%rax,4),%r11d
  mov    %r11d,(%rdi,%rax,4)
  lea    0x5(%rcx),%r11d
  mov    (%r9,%r11,4),%eax
  imul   (%rsi,%r11,4),%eax
  add    (%rdx,%r11,4),%eax
  mov    %eax,(%rdi,%r11,4)
  lea    0x6(%rcx),%eax
  mov    (%r9,%rax,4),%r11d
  imul   (%rsi,%rax,4),%r11d
  add    (%rdx,%rax,4),%r11d
  mov    %r11d,(%rdi,%rax,4)
  lea    0x7(%rcx),%r11d
  mov    (%r9,%r11,4),%eax
  imul   (%rsi,%r11,4),%eax
  add    (%rdx,%r11,4),%eax
  mov    %eax,(%rdi,%r11,4)
  lea    0x8(%rcx),%eax
  cmp    %eax,%r8d
  jbe    L91
  mov    (%r9,%rax,4),%r8d
  imul   (%rsi,%rax,4),%r8d
  add    (%rdx,%rax,4),%r8d
  mov    %r8d,(%rdi,%rax,4)
  lea    0x9(%rcx),%r8d
  mov    (%r9,%r8,4),%eax
  imul   (%rsi,%r8,4),%eax
  add    (%rdx,%r8,4),%eax
  mov    %eax,(%rdi,%r8,4)
  lea    0xa(%rcx),%eax
  mov    (%r9,%rax,4),%r8d
  imul   (%rsi,%rax,4),%r8d
  add    (%rdx,%rax,4),%r8d
  mov    %r8d,(%rdi,%rax,4)
  lea    0xb(%rcx),%r8d
  mov    (%r9,%r8,4),%eax
  imul   (%rsi,%r8,4),%eax
  add    (%rdx,%r8,4),%eax
  mov    %eax,(%rdi,%r8,4)
  lea    0xc(%rcx),%eax
L91:
  test   %r10d,%r10d
  je     L57
  mov    %eax,%r8d
  mov    (%r9,%r8,4),%ecx
  imul   (%rsi,%r8,4),%ecx
  add    (%rdx,%r8,4),%ecx
  mov    %ecx,(%rdi,%r8,4)
  cmp    $0x1,%r10d
  je     L57
  lea    0x1(%rax),%r8d
  mov    (%r9,%r8,4),%ecx
  imul   (%rsi,%r8,4),%ecx
  add    (%rdx,%r8,4),%ecx
  mov    %ecx,(%rdi,%r8,4)
  cmp    $0x3,%r10d
  jne    L57
  lea    0x2(%rax),%ecx
  mov    (%r9,%rcx,4),%eax
  imul   (%rsi,%rcx,4),%eax
  add    (%rdx,%rcx,4),%eax
  mov    %eax,(%rdi,%rcx,4)
L57:
  pop    %rbx
  ret
  cs nopw 0x0(%rax,%rax,1)
L75:
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L0:
  mov    %eax,%r11d
  mov    (%rsi,%r11,4),%ecx
  imul   (%r9,%r11,4),%ecx
  add    (%rdx,%r11,4),%ecx
  mov    %ecx,(%rdi,%r11,4)
  lea    0x1(%rax),%r11d
  mov    (%rsi,%r11,4),%ecx
  imul   (%r9,%r11,4),%ecx
  add    (%rdx,%r11,4),%ecx
  mov    %ecx,(%rdi,%r11,4)
  lea    0x2(%rax),%r11d
  mov    (%r9,%r11,4),%ecx
  imul   (%rsi,%r11,4),%ecx
  add    (%rdx,%r11,4),%ecx
  mov    %ecx,(%rdi,%r11,4)
  lea    0x3(%rax),%r11d
  add    $0x4,%eax
  mov    (%r9,%r11,4),%ecx
  imul   (%rsi,%r11,4),%ecx
  add    (%rdx,%r11,4),%ecx
  mov    %ecx,(%rdi,%r11,4)
  cmp    %eax,%r8d
  ja     L0
  jmp    L91
  nopl   0x0(%rax,%rax,1)
L87:
  xor    %eax,%eax
  jmp    L91
```

tool_calls: name: extract_symbolic_data
arguments: label: D25
datatype: byte[16]
name: extract_symbolic_data
arguments: label: D15
datatype: byte[16]
name: extract_symbolic_data
arguments: label: D9
datatype: byte[16]

tool: {"D25": [0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0c,0x00,0x00,0x00]}

tool: {"D15": [0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00]}

tool: {"D9": [0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00]}

assistant: ```c
void vector_madd(int *res, int *a, int *b, int *c, unsigned int length) {
  unsigned int i, j;
  unsigned int num_blocks = length / 4;
  unsigned int rem = length % 4;
  for (i = 0; i < num_blocks * 4; i += 4) {
    res[i + 0] = (a[i + 0] * b[i + 0] + c[i + 0]);
    res[i + 1] = (a[i + 1] * b[i + 1] + c[i + 1]);
    res[i + 2] = (a[i + 2] * b[i + 2] + c[i + 2]);
    res[i + 3] = (a[i + 3] * b[i + 3] + c[i + 3]);
  }
  for (j = 0; j < rem; j++)
    res[i + j] = (a[i + j] * b[i + j] + c[i + j]);
}
```