user: Translate the below assembly code into C programming language:

```asm
<GeogStep>:
  endbr64
  push   %r14
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x50,%rsp
  movsd  %xmm0,0x30(%rsp)
  movapd %xmm3,%xmm0
  movsd  %xmm1,0x18(%rsp)
  movsd  %xmm3,0x38(%rsp)
  movsd  %xmm2,0x8(%rsp)
  call   <sin@plt>
  movsd  0x8(%rsp),%xmm2
  movsd  %xmm0,0x20(%rsp)
  movapd %xmm2,%xmm0
  call   <sin@plt>
  movsd  0x8(%rsp),%xmm2
  movsd  %xmm0,0x28(%rsp)
  movapd %xmm2,%xmm0
  call   <cos@plt>
  movsd  0x38(%rsp),%xmm3
  movsd  0x18(%rsp),%xmm4
  pxor   %xmm6,%xmm6
  cvtsi2sd %eax,%xmm6
  addsd  %xmm3,%xmm4
  movsd  %xmm3,0x48(%rsp)
  movapd %xmm4,%xmm0
  movsd  %xmm6,0x10(%rsp)
  movsd  %xmm4,0x40(%rsp)
  call   <sin@plt>
  movsd  0x48(%rsp),%xmm3
  movsd  0x18(%rsp),%xmm4
  movsd  D48(%rip),%xmm5
  addsd  0x10(%rsp),%xmm5
  movsd  %xmm0,0x38(%rsp)
  subsd  %xmm3,%xmm4
  movsd  %xmm5,0x8(%rsp)
  movapd %xmm4,%xmm0
  movq   %xmm4,%r14
  call   <sin@plt>
  movsd  D48(%rip),%xmm3
  subsd  0x10(%rsp),%xmm3
  movapd %xmm0,%xmm1
  movsd  0x38(%rsp),%xmm2
  movsd  0x40(%rsp),%xmm4
  mulsd  0x8(%rsp),%xmm2
  mulsd  %xmm3,%xmm1
  movapd %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mulsd  D5(%rip),%xmm0
  movsd  D53(%rip),%xmm1
  comisd D48(%rip),%xmm0
  jbe    L18
L6:
  movsd  0x20(%rsp),%xmm2
  mulsd  0x28(%rsp),%xmm2
  movapd %xmm4,%xmm0
  movsd  %xmm1,0x0(%rbp)
  movsd  %xmm3,0x18(%rsp)
  movsd  %xmm2,0x10(%rsp)
  call   <cos@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  0x8(%rsp),%xmm0
  movsd  %xmm0,0x8(%rsp)
  movq   %r14,%xmm0
  call   <cos@plt>
  pxor   %xmm1,%xmm1
  movsd  0x18(%rsp),%xmm3
  movsd  0x10(%rsp),%xmm2
  cvtsi2sd %eax,%xmm1
  movapd %xmm2,%xmm0
  mulsd  %xmm3,%xmm1
  addsd  0x8(%rsp),%xmm1
  mulsd  D5(%rip),%xmm1
  call   <atan2@plt>
  addsd  0x30(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  call   <GeogLonR@plt>
  movsd  %xmm0,(%rbx)
  add    $0x50,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r14
  ret
  nopl   (%rax)
L18:
  movsd  D39(%rip),%xmm2
  movsd  D75(%rip),%xmm1
  comisd %xmm0,%xmm2
  ja     L6
  movsd  %xmm3,0x18(%rsp)
  movsd  %xmm4,0x10(%rsp)
  call   <asin@plt>
  movsd  0x18(%rsp),%xmm3
  movsd  0x10(%rsp),%xmm4
  movapd %xmm0,%xmm1
  jmp    L6
```

tool_calls: name: unpack_data
arguments: data_tag: D48
data_type: f64[2]
name: unpack_data
arguments: data_tag: D5
data_type: f64
name: unpack_data
arguments: data_tag: D53
data_type: f64
name: unpack_data
arguments: data_tag: D39
data_type: f32[2]
name: unpack_data
arguments: data_tag: D75
data_type: byte[8]

tool: {"D48": [1.0,0.5]}

tool: D5: 0.5

tool: D53: 1.5707963267948966

tool: {"D39": [0.0,-1.875]}

tool: {"D75": [0x18,0x2d,0x44,0x54,0xfb,0x21,0xf9,0xbf]}

assistant: ```c
void GeogStep(const double o1, const double a1, const double d, const double s, double *o2, double *a2) {
  double sin_s, sin_d, cos_d, dlon, a, x, y;
  sin_s = sin(s);
  sin_d = sin(d);
  cos_d = cos(d);
  a = 0.5 * (sin(a1 + s) * (1.0 + cos_d) + sin(a1 - s) * (1.0 - cos_d));
  *a2 = (a > 1.0) ? 1.570796326794896619231 : (a < -1.0) ? -1.570796326794896619231 : asin(a);
  y = sin_s * sin_d;
  x = 0.5 * (cos(a1 + s) * (1 + cos_d) + cos(a1 - s) * (1 - cos_d));
  dlon = atan2(y, x);
  *o2 = GeogLonR(o1 + dlon, 0.0);
}
```