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

```asm
<sinus>:
  endbr64
  push   %rbx
  movapd %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  mov    %edi,%ebx
  sub    $0x30,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  comisd %xmm1,%xmm0
  jbe    L46
  xorpd  D70(%rip),%xmm1
  add    $0x2,%ebx
L46:
  mulsd  D76(%rip),%xmm1
  comisd D31(%rip),%xmm1
  ja     L5
  cvttsd2si %xmm1,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  lea    (%rbx,%rax,1),%edi
  and    $0x3,%edi
  subsd  %xmm0,%xmm1
L17:
  test   $0x1,%dil
  je     L8
  movsd  D148(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
L8:
  cmp    $0x1,%edi
  jle    L38
  xorpd  D70(%rip),%xmm1
L38:
  movapd %xmm1,%xmm2
  movsd  D71(%rip),%xmm0
  mulsd  %xmm1,%xmm2
  mulsd  %xmm2,%xmm0
  subsd  D39(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  D44(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  subsd  D20(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  D109(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  D146(%rip),%xmm1
  addsd  %xmm2,%xmm1
  mulsd  %xmm2,%xmm1
  addsd  D72(%rip),%xmm1
  mulsd  %xmm2,%xmm1
  addsd  D136(%rip),%xmm1
  mulsd  %xmm2,%xmm1
  addsd  D153(%rip),%xmm1
  divsd  %xmm1,%xmm0
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L44
  add    $0x30,%rsp
  pop    %rbx
  ret
  nopl   0x0(%rax)
L5:
  movapd %xmm1,%xmm0
  lea    0x18(%rsp),%rdi
  call   <modf@plt>
  pxor   %xmm2,%xmm2
  lea    0x20(%rsp),%rdi
  cvtsi2sd %ebx,%xmm2
  addsd  0x18(%rsp),%xmm2
  movsd  %xmm0,0x8(%rsp)
  movapd %xmm2,%xmm0
  movsd  %xmm2,(%rsp)
  mulsd  D32(%rip),%xmm0
  call   <modf@plt>
  movsd  (%rsp),%xmm2
  movsd  D67(%rip),%xmm0
  mulsd  0x20(%rsp),%xmm0
  movsd  0x8(%rsp),%xmm1
  subsd  %xmm0,%xmm2
  cvttsd2si %xmm2,%edi
  jmp    L17
L44:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: data_tag: D70
type: byte[16]
name: read_data
arguments: data_tag: D76
type: f64
name: read_data
arguments: data_tag: D31
type: byte[16]
name: read_data
arguments: data_tag: D148
type: byte[8]
name: read_data
arguments: data_tag: D71
type: f64
name: read_data
arguments: data_tag: D39
type: f64
name: read_data
arguments: data_tag: D44
type: f64
name: read_data
arguments: data_tag: D20
type: f64
name: read_data
arguments: data_tag: D109
type: f64
name: read_data
arguments: data_tag: D146
type: f64
name: read_data
arguments: data_tag: D72
type: f64
name: read_data
arguments: data_tag: D136
type: f64
name: read_data
arguments: data_tag: D153
type: f64
name: read_data
arguments: data_tag: D32
type: f64
name: read_data
arguments: data_tag: D67
type: byte[8]

tool: {"D70": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: D76: 0.636619772367581

tool: {"D31": [0x00,0x00,0x00,0x00,0x00,0xff,0xdf,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x3f]}

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

tool: D71: 145.968840666577

tool: D39: 13847.2724998245

tool: D44: 440103.053537527

tool: D20: 4942908.10090284

tool: D109: 13578840.9787738

tool: D146: 132.653490878614

tool: D72: 9463.09610153821

tool: D136: 408179.22523433

tool: D153: 8644558.65292253

tool: D32: 0.25

tool: {"D67": [0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40]}

assistant: ```c
double sinus(double arg, int quad) {
  double e, f;
  int k;
  double ysq;
  double x, y;
  double temp1, temp2;
  x = arg;
  if (x < 0) {
    x = -x;
    quad = quad + 2;
  }
  x = x * 0.636619772367581;
  if (x > 32764) {
    y = modf(x, &e);
    e = e + quad;
    modf(0.25 * e, &f);
    quad = e - 4 * f;
  } else {
    k = x;
    y = x - k;
    quad = (quad + k) & 03;
  }
  if (quad & 01)
    y = 1 - y;
  if (quad > 1)
    y = -y;
  ysq = y * y;
  temp1 = ((((0.145968840666577e3 * ysq + -0.138472724998245e5) * ysq + 0.440103053537527e6) * ysq + -0.494290810090284e7) * ysq + 0.135788409787738e8) * y;
  temp2 = ((((ysq + 0.132653490878614e3) * ysq + 0.946309610153821e4) * ysq + 0.408179225234330e6) * ysq + 0.864455865292253e7);
  return (temp1 / temp2);
}
```