user: Please show me the C implementation that matches the assembly code listed below:

```asm
<print_flags_cmove>:
  endbr64
  test   %rdi,%rdi
  jne    L183
  ret
  nopw   0x0(%rax,%rax,1)
L183:
  push   %r15
  lea    D125(%rip),%r15
  push   %r14
  lea    D10(%rip),%r14
  push   %r13
  mov    $0x1,%r13d
  push   %r12
  mov    $0x80000000,%r12d
  push   %rbp
  mov    %rdi,%rbp
  mov    $0x3c,%edi
  push   %rbx
  mov    $0x20,%ebx
  sub    $0x8,%rsp
  call   <putchar@plt>
  jmp    L306
  nopl   0x0(%rax)
L37:
  cmp    $0x10000,%rax
  je     L422
  jbe    L13
  cmp    $0x80000,%rax
  je     L207
  jbe    L7
  cmp    $0x100000,%rax
  jne    L323
  lea    D75(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  nopw   0x0(%rax,%rax,1)
L323:
  add    %r13,%r13
  sub    $0x1,%ebx
  je     L194
L306:
  mov    %rbp,%rax
  and    %r13,%rax
  cmp    $0x200000,%rax
  je     L100
  jbe    L37
  cmp    $0x10000000,%rax
  je     L413
  ja     L164
  cmp    $0x4000000,%rax
  je     L210
  jbe    L206
  cmp    $0x8000000,%rax
  jne    L323
  lea    D89(%rip),%rdi
  xor    %eax,%eax
  add    %r13,%r13
  call   <printf@plt>
  sub    $0x1,%ebx
  jne    L306
L194:
  add    $0x8,%rsp
  mov    $0x3e,%edi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1060 <putchar@plt>
  cs nopw 0x0(%rax,%rax,1)
L13:
  cmp    $0x10,%rax
  je     L66
  jbe    L99
  cmp    $0x20,%rax
  jne    L323
  lea    D61(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
L7:
  cmp    $0x20000,%rax
  je     L338
  cmp    $0x40000,%rax
  jne    L323
  lea    D2(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
L206:
  cmp    $0x1000000,%rax
  je     L212
  cmp    $0x2000000,%rax
  jne    L323
  lea    D34(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
L99:
  cmp    $0x1,%rax
  je     L335
  cmp    $0x8,%rax
  jne    L323
  lea    D39(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  cs nopw 0x0(%rax,%rax,1)
L164:
  cmp    $0x40000000,%rax
  je     L350
  cmp    %r12,%rax
  jne    L257
  lea    D168(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
L257:
  cmp    $0x20000000,%rax
  jne    L323
  lea    D91(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nop
L350:
  lea    D32(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nopl   0x0(%rax,%rax,1)
L422:
  lea    D82(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nopl   0x0(%rax,%rax,1)
L207:
  lea    D156(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nopl   0x0(%rax,%rax,1)
L100:
  mov    %r15,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nopw   0x0(%rax,%rax,1)
L66:
  lea    D15(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nopl   0x0(%rax,%rax,1)
L212:
  lea    D110(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nopl   0x0(%rax,%rax,1)
L210:
  lea    D122(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nopl   0x0(%rax,%rax,1)
L338:
  lea    D134(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nopl   0x0(%rax,%rax,1)
L413:
  mov    %r14,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
  nop
L335:
  lea    D87(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L323
```

tool_calls: name: unpack_data
arguments: data_label: D125
datatype: string
name: unpack_data
arguments: data_label: D10
datatype: string
name: unpack_data
arguments: data_label: D75
datatype: string
name: unpack_data
arguments: data_label: D89
datatype: string
name: unpack_data
arguments: data_label: D61
datatype: string
name: unpack_data
arguments: data_label: D2
datatype: string
name: unpack_data
arguments: data_label: D34
datatype: string
name: unpack_data
arguments: data_label: D39
datatype: string
name: unpack_data
arguments: data_label: D168
datatype: string
name: unpack_data
arguments: data_label: D91
datatype: string
name: unpack_data
arguments: data_label: D32
datatype: string
name: unpack_data
arguments: data_label: D82
datatype: string
name: unpack_data
arguments: data_label: D156
datatype: string
name: unpack_data
arguments: data_label: D15
datatype: string
name: unpack_data
arguments: data_label: D110
datatype: string
name: unpack_data
arguments: data_label: D122
datatype: string
name: unpack_data
arguments: data_label: D134
datatype: string
name: unpack_data
arguments: data_label: D87
datatype: string

tool: D125: CM_MULTIPLY 

tool: D10: CM_1D2_OBJ 

tool: D75: CM_PICKS_UP 

tool: D89: CM_90_RANDOM 

tool: D61: CM_75_RANDOM 

tool: D2: CM_PHASE 

tool: D34: CM_CARRY_GOLD 

tool: D39: CM_20_RANDOM 

tool: D168: CM_WIN 

tool: D91: CM_2D2_OBJ 

tool: D32: CM_4D2_OBJ 

tool: D82: CM_INVISIBLE 

tool: D156: CM_EATS_OTHER 

tool: D15: CM_40_RANDOM 

tool: D110: CM_CARRY_OTHER 

tool: D122: CM_60_RANDOM 

tool: D134: CM_OPEN_DOOR 

tool: D87: CM_ATTACK_ONLY 

assistant: ```c
print_flags_cmove(cmove) unsigned long cmove;
{
  int count;
  unsigned long mask;
  if (cmove == 0)
    return;
  printf("<");
  for (count = 0, mask = 0x01; count < 32; mask <<= 1, count++) {
    switch (cmove & mask) {
    case 0x00000001L:
      printf("CM_ATTACK_ONLY ");
      break;
    case 0x00000002L:
      break;
    case 0x00000008L:
      printf("CM_20_RANDOM ");
      break;
    case 0x00000010L:
      printf("CM_40_RANDOM ");
      break;
    case 0x00000020L:
      printf("CM_75_RANDOM ");
      break;
    case 0x00010000L:
      printf("CM_INVISIBLE ");
      break;
    case 0x00020000L:
      printf("CM_OPEN_DOOR ");
      break;
    case 0x00040000L:
      printf("CM_PHASE ");
      break;
    case 0x00080000L:
      printf("CM_EATS_OTHER ");
      break;
    case 0x00100000L:
      printf("CM_PICKS_UP ");
      break;
    case 0x00200000L:
      printf("CM_MULTIPLY ");
      break;
    case 0x01000000L:
      printf("CM_CARRY_OTHER ");
      break;
    case 0x02000000L:
      printf("CM_CARRY_GOLD ");
      break;
    case 0x04000000L:
      printf("CM_60_RANDOM ");
      break;
    case 0x08000000L:
      printf("CM_90_RANDOM ");
      break;
    case 0x10000000L:
      printf("CM_1D2_OBJ ");
      break;
    case 0x20000000L:
      printf("CM_2D2_OBJ ");
      break;
    case 0x40000000L:
      printf("CM_4D2_OBJ ");
      break;
    case 0x80000000L:
      printf("CM_WIN ");
      break;
    }
  }
  printf(">");
}
```