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

```asm
<eval_if>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  cmp    $0x1,%edi
  je     L181
  cmp    $0x2,%edi
  je     L214
  cmp    $0x3,%edi
  je     L195
L133:
  xor    %eax,%eax
L63:
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L181:
  mov    (%rsi),%rdi
  call   <is_number@plt>
  test   %rax,%rax
  jne    L175
  mov    (%rbx),%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  cmpb   $0x0,(%rax)
  setne  %al
  movzbl %al,%eax
  ret
  cs nopw 0x0(%rax,%rax,1)
L195:
  mov    (%rsi),%rdi
  call   <is_number@plt>
  test   %rax,%rax
  je     L211
  mov    0x10(%rbx),%rdi
  call   <is_number@plt>
  test   %rax,%rax
  jne    L258
L211:
  mov    0x8(%rbx),%rdi
  lea    D30(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L216
  mov    0x10(%rbx),%rsi
  mov    (%rbx),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  sete   %al
  movzbl %al,%eax
  jmp    L63
  nopl   0x0(%rax,%rax,1)
L175:
  mov    (%rbx),%rdi
  xor    %edx,%edx
  xor    %esi,%esi
  call   <strtol@plt>
  test   %eax,%eax
  setne  %al
  movzbl %al,%eax
  jmp    L63
  nopl   0x0(%rax)
L214:
  mov    (%rbx),%rdi
  lea    D8(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L133
  mov    (%rbx),%rdi
  call   <is_number@plt>
  test   %rax,%rax
  jne    L199
  mov    0x8(%rbx),%rax
  cmpb   $0x0,(%rax)
  sete   %al
  movzbl %al,%eax
  jmp    L63
  nopl   0x0(%rax,%rax,1)
L216:
  mov    0x8(%rbx),%rdi
  lea    D31(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L133
  mov    0x10(%rbx),%rsi
  mov    (%rbx),%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  setne  %al
  movzbl %al,%eax
  jmp    L63
  nopl   0x0(%rax,%rax,1)
L258:
  mov    (%rbx),%rdi
  xor    %edx,%edx
  xor    %esi,%esi
  call   <strtol@plt>
  mov    0x10(%rbx),%rdi
  xor    %esi,%esi
  xor    %edx,%edx
  mov    %eax,%r12d
  call   <strtol@plt>
  mov    0x8(%rbx),%rdi
  lea    D30(%rip),%rsi
  mov    %eax,%ebp
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L164
  xor    %eax,%eax
  cmp    %ebp,%r12d
  sete   %al
  jmp    L63
  nopl   0x0(%rax,%rax,1)
L199:
  mov    (%rbx),%rdi
  xor    %edx,%edx
  xor    %esi,%esi
  call   <strtol@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  jmp    L63
L164:
  mov    0x8(%rbx),%rdi
  lea    D31(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L165
  xor    %eax,%eax
  cmp    %ebp,%r12d
  setne  %al
  jmp    L63
L165:
  mov    0x8(%rbx),%rdi
  lea    D81(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L138
L2:
  xor    %eax,%eax
  cmp    %ebp,%r12d
  setl   %al
  jmp    L63
L138:
  mov    0x8(%rbx),%rdi
  lea    D7(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L48
L122:
  xor    %eax,%eax
  cmp    %ebp,%r12d
  setg   %al
  jmp    L63
L48:
  mov    0x8(%rbx),%rdi
  lea    D80(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L2
  mov    0x8(%rbx),%rdi
  lea    D79(%rip),%rsi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L133
  jmp    L122
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D30
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D8
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D31
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D81
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D7
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D80
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D79
type_infered: string

tool: D30: ==

tool: D8: !

tool: D31: !=

tool: D81: <

tool: D7: >

tool: D80: <=

tool: D79: >=

assistant: ```c
int eval_if(int argc, char *argv[]) {
  int r = 0;
  if (argc == 1) {
    if (is_number(argv[0]))
      r = (strtol(argv[0], 0, 0)) ? 1 : 0;
    else
      r = (*argv[0]) ? 1 : 0;
  } else if (argc == 2) {
    if (strcmp(argv[0], "!") == 0) {
      if (is_number(argv[0]))
        r = (strtol(argv[0], 0, 0)) ? 0 : 1;
      else
        r = (*argv[1]) ? 0 : 1;
    }
  } else if (argc == 3) {
    if (is_number(argv[0]) && is_number(argv[2])) {
      int x, y;
      x = strtol(argv[0], 0, 0);
      y = strtol(argv[2], 0, 0);
      if (strcmp(argv[1], "==") == 0)
        r = (x == y);
      else if (strcmp(argv[1], "!=") == 0)
        r = (x != y);
      else if (strcmp(argv[1], "<") == 0)
        r = (x < y);
      else if (strcmp(argv[1], ">") == 0)
        r = (x > y);
      else if (strcmp(argv[1], "<=") == 0)
        r = (x < y);
      else if (strcmp(argv[1], ">=") == 0)
        r = (x > y);
    } else {
      if (strcmp(argv[1], "==") == 0)
        r = (strcmp(argv[0], argv[2]) == 0) ? 1 : 0;
      else if (strcmp(argv[1], "!=") == 0)
        r = (strcmp(argv[0], argv[2]) != 0) ? 1 : 0;
    }
  }
  return r;
}
```