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

```asm
<main>:
  endbr64
  sub    $0x28,%rsp
  lea    D107(%rip),%rdi
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x7(%rsp),%rsi
  lea    D69(%rip),%rdi
  xor    %eax,%eax
  call   <scanf@plt>
  lea    D45(%rip),%rdi
  call   <puts@plt>
  lea    0x10(%rsp),%rdx
  lea    0x8(%rsp),%rsi
  xor    %eax,%eax
  lea    D29(%rip),%rdi
  call   <scanf@plt>
  movzbl 0x7(%rsp),%eax
  sub    $0x25,%eax
  cmp    $0xa,%al
  ja     L21
  lea    D44(%rip),%rdx
  movzbl %al,%eax
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
L21:
  lea    D68(%rip),%rdi
  call   <puts@plt>
  nopw   0x0(%rax,%rax,1)
L0:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L39
  add    $0x28,%rsp
  ret
  movsd  0x8(%rsp),%xmm0
  cvttsd2si 0x10(%rsp),%ecx
  lea    D49(%rip),%rdi
  movsd  0x10(%rsp),%xmm1
  cvttsd2si %xmm0,%eax
  cltd
  idiv   %ecx
  mov    $0x2,%eax
  mov    %edx,%esi
  call   <printf@plt>
  jmp    L0
  movsd  0x8(%rsp),%xmm0
  movsd  0x10(%rsp),%xmm1
  mov    $0x3,%eax
  lea    D50(%rip),%rdi
  movapd %xmm0,%xmm2
  mulsd  %xmm1,%xmm2
  call   <printf@plt>
  jmp    L0
  movsd  0x8(%rsp),%xmm0
  movsd  0x10(%rsp),%xmm1
  mov    $0x3,%eax
  lea    D41(%rip),%rdi
  movapd %xmm0,%xmm2
  addsd  %xmm1,%xmm2
  call   <printf@plt>
  jmp    L0
  movsd  0x8(%rsp),%xmm0
  movsd  0x10(%rsp),%xmm1
  mov    $0x3,%eax
  lea    D33(%rip),%rdi
  movapd %xmm0,%xmm2
  subsd  %xmm1,%xmm2
  call   <printf@plt>
  jmp    L0
  movsd  0x8(%rsp),%xmm0
  movsd  0x10(%rsp),%xmm1
  mov    $0x3,%eax
  lea    D61(%rip),%rdi
  movapd %xmm0,%xmm2
  divsd  %xmm1,%xmm2
  call   <printf@plt>
  jmp    L0
L39:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D107
data_type: string
name: disassemble_data
arguments: data_tag: D69
data_type: string
name: disassemble_data
arguments: data_tag: D45
data_type: string
name: disassemble_data
arguments: data_tag: D29
data_type: string
name: disassemble_data
arguments: data_tag: D68
data_type: string
name: disassemble_data
arguments: data_tag: D49
data_type: string
name: disassemble_data
arguments: data_tag: D50
data_type: string
name: disassemble_data
arguments: data_tag: D41
data_type: string
name: disassemble_data
arguments: data_tag: D33
data_type: string
name: disassemble_data
arguments: data_tag: D61
data_type: string

tool: D107: Which operation you want to perform (+,-,*,/,%%)?


tool: D69: %c

tool: D45: Enter two operands:

tool: D29: %lf%lf

tool: D68: Please enter valid operator

tool: D49: mod remainder of %0.2lf & %0.2lf is: %d


tool: D50: multiplication of %0.2lf & %0.2lf is: %0.4lf


tool: D41: addition of %0.2lf & %0.2lf is: %0.4lf


tool: D33: subtraction of %0.2lf & %0.2lf is: %0.4lf


tool: D61: division of %0.2lf & %0.2lf is: %0.4lf


assistant: ```c
void main(void) {
  double a, b;
  char operator;
  printf("Which operation you want to perform (+,-,*,/,%%)?\n");
  scanf("%c", &operator);
  printf("Enter two operands:\n");
  scanf("%lf%lf", &a, &b);
  switch (operator) {
  case '+':
    printf("addition of %0.2lf & %0.2lf is: %0.4lf\n", a, b, a + b);
    break;
  case '-':
    printf("subtraction of %0.2lf & %0.2lf is: %0.4lf\n", a, b, a - b);
    break;
  case '*':
    printf("multiplication of %0.2lf & %0.2lf is: %0.4lf\n", a, b, a * b);
    break;
  case '/':
    printf("division of %0.2lf & %0.2lf is: %0.4lf\n", a, b, a / b);
    break;
  case '%':
    printf("mod remainder of %0.2lf & %0.2lf is: %d\n", a, b, (int)a % (int)b);
    break;
  default:
    printf("Please enter valid operator\n");
  }
}
```