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

```asm
<GPS_Math_PolarSt_LatLon_To_EN>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x130,%rsp
  movsd  %xmm0,-0xd8(%rbp)
  movsd  %xmm1,-0xe0(%rbp)
  mov    %rdi,-0xe8(%rbp)
  mov    %rsi,-0xf0(%rbp)
  movsd  %xmm2,-0xf8(%rbp)
  movsd  %xmm3,-0x100(%rbp)
  movsd  %xmm4,-0x108(%rbp)
  movsd  %xmm5,-0x110(%rbp)
  movsd  %xmm6,-0x118(%rbp)
  movsd  %xmm7,-0x120(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0xc8(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0xb8(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0xb0(%rbp)
  mov    -0x100(%rbp),%rax
  movq   %rax,%xmm0
  call   <GPS_Math_Deg_To_Rad@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x100(%rbp)
  mov    -0xf8(%rbp),%rax
  movq   %rax,%xmm0
  call   <GPS_Math_Deg_To_Rad@plt>
  movq   %xmm0,%rax
  mov    %rax,-0xf8(%rbp)
  mov    -0xe0(%rbp),%rax
  movq   %rax,%xmm0
  call   <GPS_Math_Deg_To_Rad@plt>
  movq   %xmm0,%rax
  mov    %rax,-0xe0(%rbp)
  mov    -0xd8(%rbp),%rax
  movq   %rax,%xmm0
  call   <GPS_Math_Deg_To_Rad@plt>
  movq   %xmm0,%rax
  mov    %rax,-0xd8(%rbp)
  movsd  D184(%rip),%xmm0
  movsd  %xmm0,-0x88(%rbp)
  movsd  D136(%rip),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  movsd  -0x118(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  movsd  %xmm0,-0x78(%rbp)
  movsd  -0x100(%rbp),%xmm0
  comisd D230(%rip),%xmm0
  jbe    L125
  movsd  -0x100(%rbp),%xmm0
  subsd  -0x88(%rbp),%xmm0
  movsd  %xmm0,-0x100(%rbp)
L125:
  pxor   %xmm0,%xmm0
  comisd -0xf8(%rbp),%xmm0
  jbe    L118
  movsd  D275(%rip),%xmm0
  movsd  %xmm0,-0xc0(%rbp)
  movsd  -0xf8(%rbp),%xmm0
  movq   D281(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0xa8(%rbp)
  movsd  -0x100(%rbp),%xmm0
  movq   D281(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0xa0(%rbp)
  jmp    L55
L118:
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0xc0(%rbp)
  movsd  -0xf8(%rbp),%xmm0
  movsd  %xmm0,-0xa8(%rbp)
  movsd  -0x100(%rbp),%xmm0
  movsd  %xmm0,-0xa0(%rbp)
L55:
  movsd  -0x118(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  movsd  %xmm0,-0x70(%rbp)
  movsd  -0x120(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  -0x70(%rbp),%xmm0
  subsd  -0x68(%rbp),%xmm0
  divsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movsd  D283(%rip),%xmm0
  mov    -0x60(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x58(%rbp)
  movsd  -0x58(%rbp),%xmm0
  movsd  D231(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  -0xa8(%rbp),%xmm0
  movq   D153(%rip),%xmm1
  andpd  %xmm1,%xmm0
  subsd  -0x80(%rbp),%xmm0
  movq   D153(%rip),%xmm1
  andpd  %xmm1,%xmm0
  comisd D127(%rip),%xmm0
  jbe    L33
  mov    -0xa8(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0xa8(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x30(%rbp)
  movsd  -0x58(%rbp),%xmm0
  mulsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D275(%rip),%xmm0
  subsd  -0x28(%rbp),%xmm0
  movsd  -0x28(%rbp),%xmm2
  movsd  D275(%rip),%xmm1
  addsd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movsd  -0x50(%rbp),%xmm0
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x20(%rbp)
  movsd  -0x28(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  %xmm0,%xmm1
  movsd  D275(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movsd  D283(%rip),%xmm0
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movapd %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x18(%rbp),%xmm0
  mulsd  -0x118(%rbp),%xmm0
  movsd  %xmm0,-0xb0(%rbp)
  movsd  -0xa8(%rbp),%xmm0
  movsd  D231(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  D60(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <tan@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  divsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,-0xb8(%rbp)
  jmp    L84
L33:
  movsd  -0x58(%rbp),%xmm1
  movsd  D275(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  D275(%rip),%xmm0
  subsd  -0x58(%rbp),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  -0x48(%rbp),%xmm0
  mov    -0x48(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movsd  %xmm0,-0x128(%rbp)
  movsd  -0x40(%rbp),%xmm0
  mov    -0x40(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movapd %xmm0,%xmm3
  mulsd  -0x128(%rbp),%xmm3
  movq   %xmm3,%rax
  movsd  D283(%rip),%xmm0
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rax
  mov    %rax,-0xc8(%rbp)
L84:
  movsd  -0xd8(%rbp),%xmm0
  movq   D153(%rip),%xmm1
  andpd  %xmm1,%xmm0
  subsd  -0x80(%rbp),%xmm0
  movq   D153(%rip),%xmm1
  andpd  %xmm0,%xmm1
  movsd  D127(%rip),%xmm0
  comisd %xmm1,%xmm0
  jbe    L119
  mov    -0xf0(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0xf0(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0xe8(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L153
L119:
  pxor   %xmm0,%xmm0
  ucomisd -0xc0(%rbp),%xmm0
  jp     L98
  pxor   %xmm0,%xmm0
  ucomisd -0xc0(%rbp),%xmm0
  je     L85
L98:
  movsd  -0xd8(%rbp),%xmm0
  movq   D281(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0xd8(%rbp)
  movsd  -0xe0(%rbp),%xmm0
  movq   D281(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0xe0(%rbp)
L85:
  movsd  -0xe0(%rbp),%xmm0
  subsd  -0xa0(%rbp),%xmm0
  movsd  %xmm0,-0x98(%rbp)
  movsd  -0x98(%rbp),%xmm0
  comisd D230(%rip),%xmm0
  jbe    L2
  movsd  -0x98(%rbp),%xmm0
  subsd  -0x88(%rbp),%xmm0
  movsd  %xmm0,-0x98(%rbp)
L2:
  movsd  D358(%rip),%xmm0
  comisd -0x98(%rbp),%xmm0
  jbe    L65
  movsd  -0x98(%rbp),%xmm0
  addsd  -0x88(%rbp),%xmm0
  movsd  %xmm0,-0x98(%rbp)
L65:
  mov    -0xd8(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movsd  -0x58(%rbp),%xmm0
  mulsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D275(%rip),%xmm0
  subsd  -0x28(%rbp),%xmm0
  movsd  -0x28(%rbp),%xmm2
  movsd  D275(%rip),%xmm1
  addsd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movsd  -0x50(%rbp),%xmm0
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x20(%rbp)
  movsd  -0xd8(%rbp),%xmm0
  movsd  D231(%rip),%xmm2
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  D60(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <tan@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  divsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0xa8(%rbp),%xmm0
  movq   D153(%rip),%xmm1
  andpd  %xmm1,%xmm0
  subsd  -0x80(%rbp),%xmm0
  movq   D153(%rip),%xmm1
  andpd  %xmm1,%xmm0
  comisd D127(%rip),%xmm0
  jbe    L27
  movsd  -0xb0(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  divsd  -0xb8(%rbp),%xmm0
  movsd  %xmm0,-0x90(%rbp)
  jmp    L69
L27:
  movsd  -0x78(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  divsd  -0xc8(%rbp),%xmm0
  movsd  %xmm0,-0x90(%rbp)
L69:
  mov    -0x98(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  mulsd  -0x90(%rbp),%xmm0
  addsd  -0x108(%rbp),%xmm0
  mov    -0xe8(%rbp),%rax
  movsd  %xmm0,(%rax)
  pxor   %xmm0,%xmm0
  ucomisd -0xc0(%rbp),%xmm0
  jp     L121
  pxor   %xmm0,%xmm0
  ucomisd -0xc0(%rbp),%xmm0
  je     L92
L121:
  mov    -0xe8(%rbp),%rax
  movsd  (%rax),%xmm0
  movq   D281(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  mov    -0xe8(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x98(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  mulsd  -0x90(%rbp),%xmm0
  addsd  -0x110(%rbp),%xmm0
  mov    -0xf0(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L153
L92:
  movsd  -0x90(%rbp),%xmm0
  movq   D281(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0x128(%rbp)
  mov    -0x98(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  mulsd  -0x128(%rbp),%xmm0
  addsd  -0x110(%rbp),%xmm0
  mov    -0xf0(%rbp),%rax
  movsd  %xmm0,(%rax)
  nop
L153:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D184
type_guessed: byte[8]
name: unpack_data
arguments: data_tag: D136
type_guessed: byte[8]
name: unpack_data
arguments: data_tag: D230
type_guessed: f64[2]
name: unpack_data
arguments: data_tag: D275
type_guessed: f64
name: unpack_data
arguments: data_tag: D281
type_guessed: f32[2]
name: unpack_data
arguments: data_tag: D283
type_guessed: f32[2]
name: unpack_data
arguments: data_tag: D231
type_guessed: f64
name: unpack_data
arguments: data_tag: D153
type_guessed: qword
name: unpack_data
arguments: data_tag: D127
type_guessed: byte[16]
name: unpack_data
arguments: data_tag: D60
type_guessed: byte[8]
name: unpack_data
arguments: data_tag: D358
type_guessed: byte[8]

tool: {"D184": [0x1e,0x26,0x44,0x54,0xfb,0x21,0x19,0x40]}

tool: {"D136": [0x1e,0x26,0x44,0x54,0xfb,0x21,0xf9,0x3f]}

tool: {"D230": [3.141592653589,1.0]}

tool: D275: 1

tool: {"D281": [0.0,-0.0]}

tool: {"D283": [0.0,1.75]}

tool: D231: 2

tool: D153: 9223372036854775807

tool: {"D127": [0xbb,0xbd,0xd7,0xd9,0xdf,0x7c,0xdb,0x3d,0x1e,0x26,0x44,0x54,0xfb,0x21,0xe9,0x3f]}

tool: {"D60": [0x1e,0x26,0x44,0x54,0xfb,0x21,0xe9,0x3f]}

tool: {"D358": [0x1e,0x26,0x44,0x54,0xfb,0x21,0x09,0xc0]}

assistant: ```c
void GPS_Math_PolarSt_LatLon_To_EN(double phi, double lambda, double *E, double *N, double phi1, double lambda1, double E0, double N0, double a, double b) {
  double p2;
  double po2;
  double a2;
  double b2;
  double e2;
  double e4 = (double)0.;
  double e;
  double eo2;
  double sh;
  double mc;
  double tc = (double)0.;
  double amc = (double)0.;
  double ta;
  double phi1s;
  double phi1c;
  double es;
  double op;
  double om;
  double pe;
  double polat;
  double polon;
  double dlam;
  double phis;
  double t;
  double rho;
  lambda1 = GPS_Math_Deg_To_Rad(lambda1);
  phi1 = GPS_Math_Deg_To_Rad(phi1);
  lambda = GPS_Math_Deg_To_Rad(lambda);
  phi = GPS_Math_Deg_To_Rad(phi);
  p2 = (double)3.141592653589 * (double)2.0;
  po2 = (double)3.141592653589 / (double)2.0;
  ta = a * (double)2.0;
  if (lambda1 > 3.141592653589)
    lambda1 -= p2;
  if (phi1 < (double)0.0) {
    sh = (double)1.0;
    polat = -phi1;
    polon = -lambda1;
  } else {
    sh = (double)0.0;
    polat = phi1;
    polon = lambda1;
  }
  a2 = a * a;
  b2 = b * b;
  e2 = (a2 - b2) / a2;
  e = pow(e2, (double).5);
  eo2 = e / (double)2.;
  if (fabs(fabs(polat) - po2) > (double)1.0e-10) {
    phi1s = sin(polat);
    phi1c = cos(polat);
    es = e * phi1s;
    pe = pow(((double)1. - es) / ((double)1. + es), eo2);
    mc = phi1c / pow((double)1. - es * es, (double).5);
    amc = mc * a;
    tc = tan(((double)3.141592653589 / (double)4.) - polat / (double)2.) / pe;
  } else {
    op = (double)1. + e;
    om = (double)1. - e;
    e4 = pow(pow(op, op) * pow(om, om), (double).5);
  }
  if (fabs(fabs(phi) - po2) < (double)1.0e-10)
    *E = *N = (double)0.0;
  else {
    if (sh) {
      phi *= (double)-1.0;
      lambda *= (double)-1.0;
    }
    dlam = lambda - polon;
    if (dlam > 3.141592653589)
      dlam -= p2;
    if (dlam < -3.141592653589)
      dlam += p2;
    phis = sin(phi);
    es = e * phis;
    pe = pow(((double)1. - es) / ((double)1. + es), eo2);
    t = tan(((double)3.141592653589 / (double)4.) - phi / (double)2.) / pe;
    if (fabs(fabs(polat) - po2) > (double)1.0e-10)
      rho = amc * t / tc;
    else
      rho = ta * t / e4;
    *E = rho * sin(dlam) + E0;
    if (sh) {
      *E *= (double)-1.;
      *N = rho * cos(dlam) + N0;
    } else
      *N = -rho * cos(dlam) + N0;
  }
  return;
}
```