user: 这段汇编代码用C语言表示是什么样的？

```asm
<utf32_to_utf8>:
  endbr64
  mov    %esi,%eax
  test   $0xffffff80,%eax
  jne    L80
  mov    %esi,(%rdi)
  mov    $0x1,%r8d
L4:
  mov    %r8d,%eax
  ret
  nopl   0x0(%rax)
L80:
  test   $0xfffff800,%eax
  je     L16
  test   $0xffff0000,%eax
  je     L18
  test   $0xffe00000,%eax
  je     L57
  test   $0xfc000000,%eax
  je     L30
  xor    %r8d,%r8d
  test   %esi,%esi
  js     L4
  mov    %esi,%edx
  mov    %esi,%ecx
  sar    $0xc,%eax
  mov    $0x6,%r8d
  and    $0x3f,%edx
  sar    $0x1e,%ecx
  and    $0x3f,%eax
  or     $0x80,%dl
  movd   %ecx,%xmm0
  movd   %eax,%xmm6
  mov    %edx,0x14(%rdi)
  mov    %esi,%edx
  sar    $0x6,%edx
  and    $0x3f,%edx
  or     $0x80,%dl
  mov    %edx,0x10(%rdi)
  mov    %esi,%edx
  sar    $0x18,%edx
  mov    %edx,%ecx
  mov    %esi,%edx
  sar    $0x12,%edx
  and    $0x3f,%ecx
  and    $0x3f,%edx
  movd   %ecx,%xmm7
  movd   %edx,%xmm1
  punpckldq %xmm7,%xmm0
  punpckldq %xmm6,%xmm1
  punpcklqdq %xmm1,%xmm0
  por    D21(%rip),%xmm0
  movups %xmm0,(%rdi)
  jmp    L4
  nopl   0x0(%rax,%rax,1)
L16:
  mov    %esi,%edx
  sar    $0x6,%eax
  mov    $0x2,%r8d
  and    $0x3f,%edx
  or     $0xc0,%al
  or     $0x80,%dl
  mov    %eax,(%rdi)
  mov    %r8d,%eax
  mov    %edx,0x4(%rdi)
  ret
  nopl   0x0(%rax)
L57:
  mov    %esi,%ecx
  mov    %esi,%edx
  and    $0x3f,%eax
  mov    $0x4,%r8d
  sar    $0x12,%ecx
  sar    $0xc,%edx
  movd   %eax,%xmm2
  movd   %ecx,%xmm0
  mov    %edx,%ecx
  mov    %esi,%edx
  sar    $0x6,%edx
  and    $0x3f,%ecx
  and    $0x3f,%edx
  movd   %ecx,%xmm3
  movd   %edx,%xmm1
  punpckldq %xmm3,%xmm0
  punpckldq %xmm2,%xmm1
  punpcklqdq %xmm1,%xmm0
  por    D15(%rip),%xmm0
  movups %xmm0,(%rdi)
  jmp    L4
  nopl   0x0(%rax)
L18:
  mov    %esi,%edx
  sar    $0xc,%eax
  mov    $0x3,%r8d
  and    $0x3f,%edx
  or     $0xe0,%al
  or     $0x80,%dl
  mov    %eax,(%rdi)
  mov    %r8d,%eax
  mov    %edx,0x8(%rdi)
  mov    %esi,%edx
  sar    $0x6,%edx
  and    $0x3f,%edx
  or     $0x80,%dl
  mov    %edx,0x4(%rdi)
  ret
  nopw   0x0(%rax,%rax,1)
L30:
  mov    %esi,%edx
  mov    %esi,%ecx
  sar    $0x6,%eax
  mov    $0x5,%r8d
  and    $0x3f,%edx
  shr    $0x18,%ecx
  and    $0x3f,%eax
  or     $0x80,%dl
  movd   %ecx,%xmm0
  movd   %eax,%xmm4
  mov    %edx,0x10(%rdi)
  mov    %esi,%edx
  sar    $0x12,%edx
  mov    %edx,%ecx
  mov    %esi,%edx
  sar    $0xc,%edx
  and    $0x3f,%ecx
  and    $0x3f,%edx
  movd   %ecx,%xmm5
  movd   %edx,%xmm1
  punpckldq %xmm5,%xmm0
  punpckldq %xmm4,%xmm1
  punpcklqdq %xmm1,%xmm0
  por    D0(%rip),%xmm0
  movups %xmm0,(%rdi)
  jmp    L4
```

tool_calls: name: read_data
arguments: tag: D21
type: byte[16]
name: read_data
arguments: tag: D15
type: byte[16]
name: read_data
arguments: tag: D0
type: byte[16]

tool: {"D21": [0xfc,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00]}

tool: {"D15": [0xf0,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00]}

tool: {"D0": [0xf8,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00]}

assistant: ```c
uint32_t utf32_to_utf8(uint8_t utf8[6], uint32_t utf32) {
  uint32_t utf8_len = 0;
  if ((utf32 & (~0x0000007F)) == 0) {
    utf8[0] = 0x0000007F & utf32;
    utf8_len = 1;
  } else if ((utf32 & (~0x000007FF)) == 0) {
    utf8[1] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[0] = (0x0000003F & utf32) | 0xC0;
    utf8_len = 2;
  } else if ((utf32 & (~0x0000FFFF)) == 0) {
    utf8[2] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[1] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[0] = (0x0000003F & utf32) | 0xE0;
    utf8_len = 3;
  } else if ((utf32 & (~0x001FFFFF)) == 0) {
    utf8[3] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[2] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[1] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[0] = (0x0000003F & utf32) | 0xF0;
    utf8_len = 4;
  } else if ((utf32 & (~0x03FFFFFF)) == 0) {
    utf8[4] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[3] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[2] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[1] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[0] = (0x0000003F & utf32) | 0xF8;
    utf8_len = 5;
  } else if ((utf32 & (~0x7FFFFFFF)) == 0) {
    utf8[5] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[4] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[3] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[2] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[1] = (0x0000003F & utf32) | 0x80;
    utf32 >>= 6;
    utf8[0] = (0x0000003F & utf32) | 0xFC;
    utf8_len = 6;
  }
  return utf8_len;
}
```