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

```asm
<execute_function>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  lea    D54(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L91
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  mov    %eax,%edi
  call   <push@plt>
  jmp    L89
L91:
  mov    -0x18(%rbp),%rax
  lea    D20(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L26
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  mov    %eax,%edi
  call   <push@plt>
  jmp    L89
L26:
  mov    -0x18(%rbp),%rax
  lea    D4(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L70
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <tan@plt>
  mov    %eax,%edi
  call   <push@plt>
  jmp    L89
L70:
  mov    -0x18(%rbp),%rax
  lea    D9(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L6
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  mov    %eax,%edi
  call   <push@plt>
  jmp    L89
L6:
  mov    -0x18(%rbp),%rax
  lea    D12(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L111
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  pxor   %xmm0,%xmm0
  ucomisd -0x8(%rbp),%xmm0
  jp     L133
  pxor   %xmm0,%xmm0
  ucomisd -0x8(%rbp),%xmm0
  jne    L133
  pxor   %xmm0,%xmm0
  comisd -0x10(%rbp),%xmm0
  jb     L133
  movsd  -0x10(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D31(%rip),%rax
  mov    %rax,%rdi
  mov    $0x2,%eax
  call   <printf@plt>
  jmp    L89
L133:
  movsd  -0x10(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  mov    %eax,%edi
  call   <push@plt>
  jmp    L89
L111:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D61(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L89:
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D54
type_infered: string
name: read_data
arguments: label: D20
type_infered: string
name: read_data
arguments: label: D4
type_infered: string
name: read_data
arguments: label: D9
type_infered: string
name: read_data
arguments: label: D12
type_infered: string
name: read_data
arguments: label: D31
type_infered: string
name: read_data
arguments: label: D61
type_infered: string

tool: D54: sin

tool: D20: cos

tool: D4: tan

tool: D9: exp

tool: D12: pow

tool: D31: error: trying to get '%f^%f'


tool: D61: error: unknown command '%s'


assistant: ```c
void execute_function(char *name) {
  if (strcmp(name, "sin") == 0)
    push(sin(pop()));
  else if (strcmp(name, "cos") == 0)
    push(cos(pop()));
  else if (strcmp(name, "tan") == 0)
    push(tan(pop()));
  else if (strcmp(name, "exp") == 0)
    push(exp(pop()));
  else if (strcmp(name, "pow") == 0) {
    double op2 = pop();
    double op1 = pop();
    if (op1 == 0 && op2 <= 0)
      printf("error: trying to get \'%f^%f\'\n", op1, op2);
    else
      push(pow(op1, op2));
  } else
    printf("error: unknown command \'%s\'\n", name);
}
```