user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<u_char_width>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %edi,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <u_is_ctrl@plt>
  test   %eax,%eax
  setne  %al
  movzbl %al,%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  je     L89
  mov    $0x2,%eax
  jmp    L318
L89:
  cmpl   $0x7f,-0x4(%rbp)
  setbe  %al
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  je     L362
  mov    $0x1,%eax
  jmp    L318
L362:
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <u_is_unprintable@plt>
  test   %rax,%rax
  je     L93
  mov    $0x4,%eax
  jmp    L318
L93:
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <u_is_combining@plt>
  test   %rax,%rax
  je     L1
  mov    $0x0,%eax
  jmp    L318
L1:
  cmpl   $0x10ff,-0x4(%rbp)
  setbe  %al
  movzbl %al,%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  je     L234
  mov    $0x1,%eax
  jmp    L318
L234:
  cmpl   $0x115f,-0x4(%rbp)
  jbe    L106
  cmpl   $0x2329,-0x4(%rbp)
  je     L357
  cmpl   $0x232a,-0x4(%rbp)
  je     L357
  cmpl   $0x2e7f,-0x4(%rbp)
  jbe    L128
  cmpl   $0x3029,-0x4(%rbp)
  jbe    L407
  cmpl   $0x302f,-0x4(%rbp)
  jbe    L444
  cmpl   $0x303f,-0x4(%rbp)
  je     L129
  cmpl   $0x3099,-0x4(%rbp)
  je     L58
  cmpl   $0x309a,-0x4(%rbp)
  je     L470
  cmpl   $0xa4cf,-0x4(%rbp)
  jbe    L317
  cmpl   $0xabff,-0x4(%rbp)
  jbe    L226
  cmpl   $0xd7a3,-0x4(%rbp)
  jbe    L398
L226:
  cmpl   $0xf8ff,-0x4(%rbp)
  jbe    L345
  cmpl   $0xfaff,-0x4(%rbp)
  jbe    L324
L345:
  cmpl   $0xfe2f,-0x4(%rbp)
  jbe    L372
  cmpl   $0xfe6f,-0x4(%rbp)
  jbe    L105
L372:
  cmpl   $0xfeff,-0x4(%rbp)
  jbe    L185
  cmpl   $0xff60,-0x4(%rbp)
  jbe    L6
L185:
  cmpl   $0xffdf,-0x4(%rbp)
  jbe    L59
  cmpl   $0xffe6,-0x4(%rbp)
  jbe    L412
L59:
  cmpl   $0x1ffff,-0x4(%rbp)
  jbe    L155
  cmpl   $0x2fffd,-0x4(%rbp)
  jbe    L20
L155:
  cmpl   $0x2ffff,-0x4(%rbp)
  jbe    L416
  cmpl   $0x3fffd,-0x4(%rbp)
  jbe    L188
  jmp    L416
L128:
  nop
  jmp    L222
L444:
  nop
  jmp    L222
L129:
  nop
  jmp    L222
L58:
  nop
  jmp    L222
L470:
  nop
  jmp    L222
L416:
  nop
L222:
  mov    $0x1,%eax
  jmp    L318
L106:
  nop
  jmp    L413
L357:
  nop
  jmp    L413
L407:
  nop
  jmp    L413
L317:
  nop
  jmp    L413
L398:
  nop
  jmp    L413
L324:
  nop
  jmp    L413
L105:
  nop
  jmp    L413
L6:
  nop
  jmp    L413
L412:
  nop
  jmp    L413
L20:
  nop
  jmp    L413
L188:
  nop
L413:
  mov    $0x2,%eax
L318:
  leave
  ret
```

assistant: ```c
int u_char_width(unsigned int u) {
  if (__builtin_expect(!!(u_is_ctrl(u)), 0))
    return 2;
  if (__builtin_expect(!!(u < 0x80), 1))
    return 1;
  if (u_is_unprintable(u))
    return 4;
  if (u_is_combining(u))
    return 0;
  if (__builtin_expect(!!(u < 0x1100U), 1))
    return 1;
  if (u <= 0x115fU)
    goto wide;
  if (u == 0x2329U || u == 0x232aU)
    goto wide;
  if (u < 0x2e80U)
    goto narrow;
  if (u < 0x302aU)
    goto wide;
  if (u <= 0x302fU)
    goto narrow;
  if (u == 0x303fU)
    goto narrow;
  if (u == 0x3099U)
    goto narrow;
  if (u == 0x309aU)
    goto narrow;
  if (u <= 0xa4cfU)
    goto wide;
  if (u >= 0xac00U && u <= 0xd7a3U)
    goto wide;
  if (u >= 0xf900U && u <= 0xfaffU)
    goto wide;
  if (u >= 0xfe30U && u <= 0xfe6fU)
    goto wide;
  if (u >= 0xff00U && u <= 0xff60U)
    goto wide;
  if (u >= 0xffe0U && u <= 0xffe6U)
    goto wide;
  if (u >= 0x20000U && u <= 0x2fffdU)
    goto wide;
  if (u >= 0x30000U && u <= 0x3fffdU)
    goto wide;
narrow:
  return 1;
wide:
  return 2;
}
```