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

```asm
<calc_operation>:
  endbr64
  push   %rbp
  sub    $0x10,%rsp
  movsd  %xmm0,0x8(%rsp)
  pxor   %xmm0,%xmm0
  movsd  %xmm1,(%rsp)
  test   %rdi,%rdi
  je     L9
  lea    D20(%rip),%rsi
  mov    %rdi,%rbp
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L133
  movsd  0x8(%rsp),%xmm0
  addsd  (%rsp),%xmm0
L9:
  add    $0x10,%rsp
  pop    %rbp
  ret
  nopw   0x0(%rax,%rax,1)
L133:
  lea    D25(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L115
  movsd  0x8(%rsp),%xmm0
  subsd  (%rsp),%xmm0
  add    $0x10,%rsp
  pop    %rbp
  ret
  nopl   (%rax)
L115:
  lea    D37(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L113
  movsd  0x8(%rsp),%xmm0
  mulsd  (%rsp),%xmm0
  jmp    L9
  nopl   0x0(%rax)
L113:
  lea    D61(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L123
  movsd  (%rsp),%xmm4
  pxor   %xmm0,%xmm0
  ucomisd %xmm0,%xmm4
  jp     L102
  je     L9
L102:
  movsd  0x8(%rsp),%xmm0
  divsd  (%rsp),%xmm0
  jmp    L9
  nopl   0x0(%rax)
L123:
  lea    D80(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L67
  movsd  (%rsp),%xmm3
  pxor   %xmm0,%xmm0
  ucomisd %xmm0,%xmm3
  jp     L64
  je     L9
L64:
  movsd  D26(%rip),%xmm2
  movsd  0x8(%rsp),%xmm0
  divsd  (%rsp),%xmm0
  movapd %xmm0,%xmm1
  movsd  D36(%rip),%xmm3
  andpd  %xmm2,%xmm1
  ucomisd %xmm1,%xmm3
  jbe    L9
  cvttsd2si %xmm0,%rax
  pxor   %xmm1,%xmm1
  movsd  D92(%rip),%xmm4
  andnpd %xmm0,%xmm2
  cvtsi2sd %rax,%xmm1
  movapd %xmm1,%xmm3
  cmpnlesd %xmm0,%xmm3
  andpd  %xmm4,%xmm3
  subsd  %xmm3,%xmm1
  orpd   %xmm2,%xmm1
  movapd %xmm1,%xmm0
  jmp    L9
  nopw   0x0(%rax,%rax,1)
L67:
  lea    D84(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L112
  movsd  (%rsp),%xmm3
  pxor   %xmm0,%xmm0
  ucomisd %xmm0,%xmm3
  jp     L85
  je     L9
L85:
  movsd  (%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  add    $0x10,%rsp
  pop    %rbp
  jmp    1070 <fmod@plt>
L112:
  lea    D51(%rip),%rsi
  mov    %rbp,%rdi
  call   <strcmp@plt>
  pxor   %xmm0,%xmm0
  test   %rax,%rax
  jne    L9
  movsd  (%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  add    $0x10,%rsp
  pop    %rbp
  jmp    1090 <pow@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D20
type_infered: string
name: disassemble_data
arguments: tag: D25
type_infered: string
name: disassemble_data
arguments: tag: D37
type_infered: string
name: disassemble_data
arguments: tag: D61
type_infered: string
name: disassemble_data
arguments: tag: D80
type_infered: string
name: disassemble_data
arguments: tag: D26
type_infered: byte[8]
name: disassemble_data
arguments: tag: D36
type_infered: byte[8]
name: disassemble_data
arguments: tag: D92
type_infered: byte[8]
name: disassemble_data
arguments: tag: D84
type_infered: string
name: disassemble_data
arguments: tag: D51
type_infered: string

tool: D20: +

tool: D25: -

tool: D37: *

tool: D61: /

tool: D80: //

tool: {"D26": [0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f]}

tool: {"D36": [0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x43]}

tool: {"D92": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: D84: %

tool: D51: **

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;
}
```