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

```asm
<geo_map>:
  endbr64
  mov    %rsi,%rax
  mov    %edx,%esi
  mov    %ecx,%edx
  and    $0xfffffffb,%edx
  cmove  %edx,%r8d
  imul   $0x64,%ecx,%ecx
  add    %r8d,%ecx
  cmp    $0x26c,%ecx
  jg     L22
  cmp    $0x1f3,%ecx
  jle    L89
  sub    $0x1f4,%ecx
  cmp    $0x78,%ecx
  ja     L135
  mov    %ecx,%ecx
  lea    D1(%rip),%r8
  movslq (%r8,%rcx,4),%rdx
  add    %r8,%rdx
  notrack jmp *%rdx
L89:
  test   %ecx,%ecx
  je     L173
  cmp    $0x190,%ecx
  jne    L610
L173:
  lea    -0x1(%rsi),%ecx
  cmp    $0xffffffff,%edi
  cmovne %edi,%ecx
  jmp    L75
L610:
  mov    $0xffffffff,%ecx
  jmp    L75
  lea    -0x1(%rsi),%ecx
  movslq %esi,%rsi
  mov    $0x0,%edx
  div    %rsi
  sub    %edx,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    %ecx,%edi
  setge  %cl
  movzbl %cl,%ecx
  add    %edi,%ecx
  jmp    L75
  movslq %esi,%rsi
  mov    $0x0,%edx
  div    %rsi
  mov    %edx,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    %edx,%edi
  setge  %cl
  movzbl %cl,%ecx
  add    %edi,%ecx
  jmp    L75
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %esi,%eax
  sub    %edx,%eax
  lea    -0x1(%rax),%ecx
  cmp    $0xffffffff,%edi
  je     L75
  add    %edi,%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %edx,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  lea    0x1(%rdi,%rdx,1),%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
  lea    0x1(%rdi),%ecx
  jmp    L75
  lea    -0x1(%rsi),%ecx
  cmp    $0xfffffffe,%edi
  je     L75
  lea    -0x2(%rsi),%ecx
  cmp    $0xffffffff,%edi
  cmovne %edi,%ecx
  jmp    L75
  lea    -0x1(%rsi),%ecx
  cmp    $0xfffffffe,%edi
  je     L75
  lea    -0x2(%rsi),%ecx
  sub    $0x1,%esi
  movslq %esi,%rsi
  mov    $0x0,%edx
  div    %rsi
  sub    %edx,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    %ecx,%edi
  setge  %cl
  movzbl %cl,%ecx
  add    %edi,%ecx
  jmp    L75
  lea    -0x1(%rsi),%ecx
  cmp    $0xfffffffe,%edi
  je     L75
  sub    $0x1,%esi
  movslq %esi,%rsi
  mov    $0x0,%edx
  div    %rsi
  mov    %edx,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    %edx,%edi
  setge  %cl
  movzbl %cl,%ecx
  add    %edi,%ecx
  jmp    L75
  lea    -0x1(%rsi),%ecx
  cmp    $0xfffffffe,%edi
  je     L75
  sub    $0x1,%esi
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %esi,%eax
  sub    %edx,%eax
  lea    -0x1(%rax),%ecx
  cmp    $0xffffffff,%edi
  je     L75
  add    %edi,%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
  lea    -0x1(%rsi),%ecx
  cmp    $0xfffffffe,%edi
  je     L75
  sub    $0x1,%esi
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %edx,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  lea    0x1(%rdi,%rdx,1),%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
  sub    $0x1,%esi
  lea    0x1(%rdi),%ecx
  cmp    $0xfffffffe,%edi
  cmove  %esi,%ecx
  jmp    L75
  mov    $0x0,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  lea    0x2(%rdi),%ecx
  cmp    $0xfffffffe,%edi
  mov    $0x1,%eax
  cmove  %eax,%ecx
  jmp    L75
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %esi,%eax
  sub    %edx,%eax
  lea    -0x1(%rax),%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    $0xfffffffe,%edi
  je     L539
  sub    $0x1,%esi
  cmp    %ecx,%esi
  je     L87
  lea    0x2(%rdi),%eax
  cmp    %ecx,%edi
  cmovge %eax,%edi
  mov    %edi,%ecx
  jmp    L75
L539:
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
L87:
  lea    0x1(%rdi),%ecx
  jmp    L75
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %edx,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    $0xfffffffe,%edi
  je     L241
  sub    $0x1,%esi
  lea    0x1(%rdi),%ecx
  cmp    %edx,%esi
  je     L75
  lea    0x2(%rdi),%ecx
  cmp    %edx,%edi
  cmovl  %edi,%ecx
  jmp    L75
L241:
  lea    0x1(%rdx),%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %esi,%eax
  sub    %edx,%eax
  lea    -0x1(%rax),%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    $0xfffffffe,%edi
  je     L404
  lea    0x1(%rax,%rdi,1),%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
L404:
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %edx,%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    $0xfffffffe,%edi
  je     L396
  lea    0x2(%rdi,%rdx,1),%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
L396:
  lea    0x1(%rdx),%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
  add    $0x1,%rax
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %esi,%eax
  sub    %edx,%eax
  lea    -0x1(%rax),%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    $0xfffffffe,%edi
  je     L82
  sub    $0x1,%esi
  cmp    %ecx,%esi
  je     L440
  lea    0x2(%rdi),%eax
  cmp    %ecx,%edi
  cmovge %eax,%edi
  mov    %edi,%ecx
  jmp    L75
L82:
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
L440:
  lea    0x1(%rdi),%ecx
  jmp    L75
  movslq %esi,%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %esi,%eax
  sub    %edx,%eax
  lea    -0x1(%rax),%ecx
  cmp    $0xffffffff,%edi
  je     L75
  cmp    $0xfffffffe,%edi
  je     L139
  add    %edi,%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
L139:
  lea    -0x1(%rcx,%rsi,1),%eax
  cltd
  idiv   %esi
  mov    %edx,%ecx
  jmp    L75
L22:
  mov    $0xffffffff,%ecx
  jmp    L75
L135:
  mov    $0xffffffff,%ecx
L75:
  mov    %ecx,%eax
  ret
```

assistant: ```c
int geo_map(int block, unsigned long long stripe, int raid_disks, int level, int layout) {
  int pd;
  if ((level == 0) || (level == 4))
    layout = 0;
  switch (level * 100 + layout) {
  case 000:
  case 400:
  case 500 + 5:
    if (block == -1)
      return raid_disks - 1;
    return block;
  case 500 + 0:
    pd = (raid_disks - 1) - stripe % raid_disks;
    if (block == -1)
      return pd;
    if (block >= pd)
      block++;
    return block;
  case 500 + 1:
    pd = stripe % raid_disks;
    if (block == -1)
      return pd;
    if (block >= pd)
      block++;
    return block;
  case 500 + 2:
    pd = (raid_disks - 1) - stripe % raid_disks;
    if (block == -1)
      return pd;
    return (pd + 1 + block) % raid_disks;
  case 500 + 3:
    pd = stripe % raid_disks;
    if (block == -1)
      return pd;
    return (pd + 1 + block) % raid_disks;
  case 500 + 4:
    return block + 1;
  case 600 + 5:
    if (block == -2)
      return raid_disks - 1;
    if (block == -1)
      return raid_disks - 2;
    return block;
  case 600 + 16:
    if (block == -2)
      return raid_disks - 1;
    raid_disks--;
    pd = (raid_disks - 1) - stripe % raid_disks;
    if (block == -1)
      return pd;
    if (block >= pd)
      block++;
    return block;
  case 600 + 17:
    if (block == -2)
      return raid_disks - 1;
    raid_disks--;
    pd = stripe % raid_disks;
    if (block == -1)
      return pd;
    if (block >= pd)
      block++;
    return block;
  case 600 + 18:
    if (block == -2)
      return raid_disks - 1;
    raid_disks--;
    pd = (raid_disks - 1) - stripe % raid_disks;
    if (block == -1)
      return pd;
    return (pd + 1 + block) % raid_disks;
  case 600 + 19:
    if (block == -2)
      return raid_disks - 1;
    raid_disks--;
    pd = stripe % raid_disks;
    if (block == -1)
      return pd;
    return (pd + 1 + block) % raid_disks;
  case 600 + 20:
    if (block == -2)
      return raid_disks - 1;
    return block + 1;
  case 600 + 4:
    if (block == -1)
      return 0;
    if (block == -2)
      return 1;
    return block + 2;
  case 600 + 0:
    pd = raid_disks - 1 - (stripe % raid_disks);
    if (block == -1)
      return pd;
    if (block == -2)
      return (pd + 1) % raid_disks;
    if (pd == raid_disks - 1)
      return block + 1;
    if (block >= pd)
      return block + 2;
    return block;
  case 600 + 8:
  case 600 + 1:
    pd = stripe % raid_disks;
    if (block == -1)
      return pd;
    if (block == -2)
      return (pd + 1) % raid_disks;
    if (pd == raid_disks - 1)
      return block + 1;
    if (block >= pd)
      return block + 2;
    return block;
  case 600 + 2:
    pd = raid_disks - 1 - (stripe % raid_disks);
    if (block == -1)
      return pd;
    if (block == -2)
      return (pd + 1) % raid_disks;
    return (pd + 2 + block) % raid_disks;
  case 600 + 3:
    pd = stripe % raid_disks;
    if (block == -1)
      return pd;
    if (block == -2)
      return (pd + 1) % raid_disks;
    return (pd + 2 + block) % raid_disks;
  case 600 + 9:
    pd = raid_disks - 1 - ((stripe + 1) % raid_disks);
    if (block == -1)
      return pd;
    if (block == -2)
      return (pd + 1) % raid_disks;
    if (pd == raid_disks - 1)
      return block + 1;
    if (block >= pd)
      return block + 2;
    return block;
  case 600 + 10:
    pd = raid_disks - 1 - (stripe % raid_disks);
    if (block == -1)
      return pd;
    if (block == -2)
      return (pd + raid_disks - 1) % raid_disks;
    return (pd + 1 + block) % raid_disks;
  }
  return -1;
}
```