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

```asm
<__kernel_cos>:
  endbr64
  movq   %xmm0,%rax
  movapd %xmm0,%xmm4
  sar    $0x20,%rax
  and    $0x7fffffff,%eax
  cmp    $0x3e3fffff,%eax
  jg     L14
  cvttsd2si %xmm0,%eax
  movsd  D181(%rip),%xmm0
  test   %eax,%eax
  je     L38
  movapd %xmm4,%xmm3
  movsd  D75(%rip),%xmm2
  mulsd  %xmm4,%xmm3
  mulsd  %xmm3,%xmm2
  addsd  D50(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  subsd  D88(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  addsd  D119(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  subsd  D141(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  addsd  D85(%rip),%xmm2
  mulsd  %xmm3,%xmm2
L37:
  mulsd  %xmm1,%xmm4
  movsd  D154(%rip),%xmm0
  mulsd  %xmm3,%xmm2
  mulsd  %xmm3,%xmm0
  subsd  %xmm4,%xmm2
  movapd %xmm0,%xmm1
  movsd  D181(%rip),%xmm0
  subsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  ret
  nopw   0x0(%rax,%rax,1)
L14:
  movapd %xmm0,%xmm3
  movsd  D75(%rip),%xmm2
  mulsd  %xmm0,%xmm3
  mulsd  %xmm3,%xmm2
  addsd  D50(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  subsd  D88(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  addsd  D119(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  subsd  D141(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  addsd  D85(%rip),%xmm2
  mulsd  %xmm3,%xmm2
  cmp    $0x3fd33332,%eax
  jle    L37
  cmp    $0x3fe90000,%eax
  jg     L3
  sub    $0x200000,%eax
  movsd  D181(%rip),%xmm0
  shl    $0x20,%rax
  movq   %rax,%xmm6
  subsd  %xmm6,%xmm0
L39:
  movsd  D154(%rip),%xmm5
  mulsd  %xmm3,%xmm2
  mulsd  %xmm1,%xmm4
  mulsd  %xmm3,%xmm5
  subsd  %xmm4,%xmm2
  subsd  %xmm6,%xmm5
  subsd  %xmm2,%xmm5
  subsd  %xmm5,%xmm0
  ret
  nopl   0x0(%rax)
L3:
  movsd  D74(%rip),%xmm0
  movsd  D163(%rip),%xmm6
  jmp    L39
  nopw   0x0(%rax,%rax,1)
L38:
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D181
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D75
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D50
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D88
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D119
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D141
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D85
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D154
type_infered: f64
name: disassemble_data
arguments: data_tag: D74
type_infered: byte[8]
name: disassemble_data
arguments: data_tag: D163
type_infered: f64

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

tool: {"D75": [0xd4,0x38,0x88,0xbe,0xe9,0xfa,0xa8,0xbd]}

tool: {"D50": [0xc4,0xb1,0xb4,0xbd,0x9e,0xee,0x21,0x3e]}

tool: {"D88": [0xad,0x52,0x9c,0x80,0x4f,0x7e,0x92,0x3e]}

tool: {"D119": [0x90,0x15,0xcb,0x19,0xa0,0x01,0xfa,0x3e]}

tool: {"D141": [0x77,0x51,0xc1,0x16,0x6c,0xc1,0x56,0x3f]}

tool: {"D85": [0x4c,0x55,0x55,0x55,0x55,0x55,0xa5,0x3f]}

tool: D154: 0.5

tool: {"D74": [0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x3f]}

tool: D163: 0.28125

assistant: ```c
double __kernel_cos(double x, double y) {
  double a, hz, z, r, qx;
  int ix;
  ix = *(1 + (int *)&x) & 0x7fffffff;
  if (ix < 0x3e400000) {
    if (((int)x) == 0) {
      return 1.00000000000000000000e+00;
    }
  }
  z = x * x;
  r = z * (4.16666666666666019037e-02 + z * (-1.38888888888741095749e-03 + z * (2.48015872894767294178e-05 + z * (-2.75573143513906633035e-07 + z * (2.08757232129817482790e-09 + z * -1.13596475577881948265e-11)))));
  if (ix < 0x3FD33333) {
    return 1.00000000000000000000e+00 - (0.5 * z - (z * r - x * y));
  } else {
    if (ix > 0x3fe90000) {
      qx = 0.28125;
    } else {
      *(1 + (int *)&qx) = ix - 0x00200000;
      *(int *)&qx = 0;
    }
    hz = 0.5 * z - qx;
    a = 1.00000000000000000000e+00 - qx;
    return a - (hz - (z * r - x * y));
  }
}
```