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

```asm
<http_base64decode>:
  endbr64
  sub    $0x118,%rsp
  pcmpeqd %xmm0,%xmm0
  mov    %rdx,%r9
  movdqa D54(%rip),%xmm1
  mov    %fs:0x28,%rax
  mov    %rax,0x108(%rsp)
  xor    %eax,%eax
  movaps %xmm0,(%rsp)
  movaps %xmm1,0x20(%rsp)
  movdqa D21(%rip),%xmm1
  movaps %xmm0,0x10(%rsp)
  movaps %xmm1,0x30(%rsp)
  movdqa D20(%rip),%xmm1
  movaps %xmm0,0x80(%rsp)
  movaps %xmm1,0x40(%rsp)
  movdqa D56(%rip),%xmm1
  movaps %xmm0,0x90(%rsp)
  movaps %xmm1,0x50(%rsp)
  movdqa D48(%rip),%xmm1
  movaps %xmm0,0xa0(%rsp)
  movaps %xmm1,0x60(%rsp)
  movdqa D37(%rip),%xmm1
  movaps %xmm0,0xb0(%rsp)
  movaps %xmm1,0x70(%rsp)
  movaps %xmm0,0xc0(%rsp)
  movaps %xmm0,0xd0(%rsp)
  movaps %xmm0,0xe0(%rsp)
  movaps %xmm0,0xf0(%rsp)
  test   %esi,%esi
  jle    L32
  sub    $0x1,%esi
  shr    $0x2,%esi
  mov    %esi,%eax
  lea    0x4(%rdi,%rax,4),%r8
  nopl   0x0(%rax)
L1:
  movzbl (%rdi),%eax
  add    $0x4,%rdi
  add    $0x3,%rdx
  movsbl (%rsp,%rax,1),%ecx
  movzbl -0x3(%rdi),%eax
  movzbl (%rsp,%rax,1),%eax
  shl    $0x2,%ecx
  sar    $0x4,%al
  or     %ecx,%eax
  mov    %al,-0x3(%rdx)
  movzbl -0x3(%rdi),%eax
  movsbl (%rsp,%rax,1),%ecx
  movzbl -0x2(%rdi),%eax
  movzbl (%rsp,%rax,1),%eax
  shl    $0x4,%ecx
  sar    $0x2,%al
  or     %ecx,%eax
  mov    %al,-0x2(%rdx)
  movzbl -0x2(%rdi),%eax
  movzbl -0x1(%rdi),%ecx
  movsbl (%rsp,%rax,1),%eax
  shl    $0x6,%eax
  or     (%rsp,%rcx,1),%al
  mov    %al,-0x1(%rdx)
  cmp    %rdi,%r8
  jne    L1
  lea    0x3(%rsi,%rsi,2),%eax
  movslq %eax,%rdx
  add    %rdx,%r9
L6:
  movb   $0x0,(%r9)
  mov    0x108(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L34
  add    $0x118,%rsp
  ret
  nopl   0x0(%rax,%rax,1)
L32:
  xor    %eax,%eax
  jmp    L6
L34:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D54
data_type: byte[16]
name: retrieve_data
arguments: label: D21
data_type: byte[16]
name: retrieve_data
arguments: label: D20
data_type: byte[16]
name: retrieve_data
arguments: label: D56
data_type: byte[16]
name: retrieve_data
arguments: label: D48
data_type: byte[16]
name: retrieve_data
arguments: label: D37
data_type: byte[16]

tool: {"D54": [0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3e,0xff,0xff,0xff,0x3f]}

tool: {"D21": [0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0xff,0xff,0xff,0x00,0xff,0xff]}

tool: {"D20": [0xff,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e]}

tool: {"D56": [0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0xff,0xff,0xff,0xff,0xff]}

tool: {"D48": [0xff,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28]}

tool: {"D37": [0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0xff,0xff,0xff,0xff,0xff]}

assistant: ```c
int http_base64decode(unsigned char *src, int src_len, unsigned char *dst) {
  int i = 0, j = 0;
  char base64_decode_map[256] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 0, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
  for (; i < src_len; i += 4) {
    dst[j++] = (base64_decode_map[src[i]] << 2) | (base64_decode_map[src[i + 1]] >> 4);
    dst[j++] = (base64_decode_map[src[i + 1]] << 4) | (base64_decode_map[src[i + 2]] >> 2);
    dst[j++] = (base64_decode_map[src[i + 2]] << 6) | (base64_decode_map[src[i + 3]]);
  }
  dst[j] = '\0';
  return j;
}
```