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

```asm
<calc_operation>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x8(%rbp)
  movsd  %xmm0,-0x10(%rbp)
  movsd  %xmm1,-0x18(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L120
  mov    D28(%rip),%rax
  jmp    L151
L120:
  mov    -0x8(%rbp),%rax
  lea    D43(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L194
  movsd  -0x10(%rbp),%xmm0
  addsd  -0x18(%rbp),%xmm0
  movq   %xmm0,%rax
  jmp    L151
L194:
  mov    -0x8(%rbp),%rax
  lea    D51(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L68
  movsd  -0x10(%rbp),%xmm0
  subsd  -0x18(%rbp),%xmm0
  movq   %xmm0,%rax
  jmp    L151
L68:
  mov    -0x8(%rbp),%rax
  lea    D116(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L127
  movsd  -0x10(%rbp),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  movq   %xmm0,%rax
  jmp    L151
L127:
  mov    -0x8(%rbp),%rax
  lea    D36(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L232
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jp     L30
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  je     L225
L30:
  movsd  -0x10(%rbp),%xmm0
  divsd  -0x18(%rbp),%xmm0
  movq   %xmm0,%rax
  jmp    L151
L225:
  mov    D28(%rip),%rax
  jmp    L151
L232:
  mov    -0x8(%rbp),%rax
  lea    D24(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L133
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jp     L231
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  je     L7
L231:
  movsd  -0x10(%rbp),%xmm0
  divsd  -0x18(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <floor@plt>
  movq   %xmm0,%rax
  jmp    L151
L7:
  mov    D28(%rip),%rax
  jmp    L151
L133:
  mov    -0x8(%rbp),%rax
  lea    D76(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L240
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jp     L9
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  je     L207
L9:
  movsd  -0x18(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <fmod@plt>
  movq   %xmm0,%rax
  jmp    L151
L207:
  mov    D28(%rip),%rax
  jmp    L151
L240:
  mov    -0x8(%rbp),%rax
  lea    D18(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L98
  movsd  -0x18(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rax
  jmp    L151
L98:
  mov    D28(%rip),%rax
L151:
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D28
data_type: byte[8]
name: unpack_data
arguments: tag: D43
data_type: string
name: unpack_data
arguments: tag: D51
data_type: string
name: unpack_data
arguments: tag: D116
data_type: string
name: unpack_data
arguments: tag: D36
data_type: string
name: unpack_data
arguments: tag: D24
data_type: string
name: unpack_data
arguments: tag: D76
data_type: string
name: unpack_data
arguments: tag: D18
data_type: string

tool: {"D28": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: D43: +

tool: D51: -

tool: D116: *

tool: D36: /

tool: D24: //

tool: D76: %

tool: D18: **

assistant: ```c
double calc_operation(const char *oper, double value1, double value2) {
  if (!oper)
    return 0;
  if (strcmp(oper, "+") == 0)
    return value1 + value2;
  if (strcmp(oper, "-") == 0)
    return value1 - value2;
  if (strcmp(oper, "*") == 0)
    return value1 * value2;
  if (strcmp(oper, "/") == 0)
    return (value2 != 0) ? value1 / value2 : 0;
  if (strcmp(oper, "//") == 0)
    return (value2 != 0) ? floor(value1 / value2) : 0;
  if (strcmp(oper, "%") == 0)
    return (value2 != 0) ? fmod(value1, value2) : 0;
  if (strcmp(oper, "**") == 0)
    return pow(value1, value2);
  return 0;
}
```