user: What is the c source code of the assembly code below:

```asm
<gsw_sa_from_rho>:
  endbr64
  push   %rbx
  movapd %xmm0,%xmm7
  sub    $0x40,%rsp
  movsd  %xmm0,0x38(%rsp)
  movsd  D89(%rip),%xmm0
  movsd  %xmm2,0x18(%rsp)
  movapd %xmm0,%xmm6
  pxor   %xmm0,%xmm0
  movsd  %xmm1,0x10(%rsp)
  divsd  %xmm7,%xmm6
  movsd  %xmm6,0x8(%rsp)
  call   <gsw_specvol@plt>
  mov    D49(%rip),%rax
  movsd  0x18(%rsp),%xmm2
  movsd  0x10(%rsp),%xmm1
  movsd  %xmm0,0x20(%rsp)
  movq   %rax,%xmm0
  call   <gsw_specvol@plt>
  movsd  0x20(%rsp),%xmm5
  pxor   %xmm6,%xmm6
  movsd  0x8(%rsp),%xmm3
  movapd %xmm0,%xmm4
  movsd  0x10(%rsp),%xmm1
  movsd  0x18(%rsp),%xmm2
  subsd  %xmm5,%xmm3
  mulsd  D49(%rip),%xmm3
  subsd  %xmm5,%xmm4
  divsd  %xmm4,%xmm3
  comisd %xmm3,%xmm6
  ja     L29
  comisd D49(%rip),%xmm3
  ja     L29
L7:
  mov    $0x2,%ebx
  divsd  D49(%rip),%xmm4
L35:
  movapd %xmm3,%xmm0
  movsd  %xmm4,0x28(%rsp)
  movsd  %xmm2,0x18(%rsp)
  movsd  %xmm1,0x20(%rsp)
  movsd  %xmm3,0x10(%rsp)
  call   <gsw_specvol@plt>
  movsd  0x28(%rsp),%xmm4
  movsd  0x10(%rsp),%xmm3
  movapd %xmm0,%xmm5
  subsd  0x8(%rsp),%xmm5
  movsd  0x20(%rsp),%xmm1
  movsd  0x18(%rsp),%xmm2
  movsd  %xmm3,0x28(%rsp)
  movsd  %xmm1,0x10(%rsp)
  movapd %xmm5,%xmm0
  movsd  %xmm5,0x30(%rsp)
  divsd  %xmm4,%xmm0
  movapd %xmm3,%xmm4
  subsd  %xmm0,%xmm4
  addsd  %xmm3,%xmm4
  mulsd  D71(%rip),%xmm4
  movapd %xmm4,%xmm0
  movsd  %xmm4,0x20(%rsp)
  call   <gsw_alpha@plt>
  movsd  0x20(%rsp),%xmm4
  movsd  0x18(%rsp),%xmm2
  movsd  0x10(%rsp),%xmm1
  movapd %xmm4,%xmm0
  call   <gsw_beta@plt>
  movsd  0x30(%rsp),%xmm5
  pxor   %xmm7,%xmm7
  movsd  0x28(%rsp),%xmm3
  movapd %xmm0,%xmm4
  movsd  0x10(%rsp),%xmm1
  movsd  0x18(%rsp),%xmm2
  xorpd  D8(%rip),%xmm4
  divsd  0x38(%rsp),%xmm4
  divsd  %xmm4,%xmm5
  subsd  %xmm5,%xmm3
  comisd %xmm3,%xmm7
  ja     L63
  comisd D49(%rip),%xmm3
  jbe    L30
L63:
  movsd  D93(%rip),%xmm3
L30:
  cmp    $0x1,%ebx
  jne    L38
  add    $0x40,%rsp
  movapd %xmm3,%xmm0
  pop    %rbx
  ret
  nopw   0x0(%rax,%rax,1)
L29:
  movsd  D93(%rip),%xmm3
  jmp    L7
  nopl   (%rax)
L38:
  mov    $0x1,%ebx
  jmp    L35
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D89
type: f64
name: extract_symbolic_data
arguments: data_label: D49
type: f64[2]
name: extract_symbolic_data
arguments: data_label: D71
type: f64
name: extract_symbolic_data
arguments: data_label: D8
type: f32[4]
name: extract_symbolic_data
arguments: data_label: D93
type: f64

tool: D89: 1

tool: {"D49": [50.0,0.5]}

tool: D71: 0.5

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

tool: D93: 9000000000000000.0

assistant: ```c
double gsw_sa_from_rho(double rho, double ct, double p) {
  int no_iter;
  double sa, v_lab, v_0, v_50, v_sa, sa_old, delta_v, sa_mean, alpha, beta;
  v_lab = 1e0 / rho;
  v_0 = gsw_specvol(0e0, ct, p);
  v_50 = gsw_specvol(50e0, ct, p);
  sa = 50e0 * (v_lab - v_0) / (v_50 - v_0);
  if (sa < 0e0 || sa > 50e0)
    sa = 9e15;
  v_sa = (v_50 - v_0) / 50e0;
  for (no_iter = 1; no_iter <= 2; no_iter++) {
    sa_old = sa;
    delta_v = gsw_specvol(sa_old, ct, p) - v_lab;
    sa = sa_old - delta_v / v_sa;
    sa_mean = 0.5e0 * (sa + sa_old);
    alpha = gsw_alpha(sa_mean, ct, p);
    beta = gsw_beta(sa_mean, ct, p);
    v_sa = -beta / rho;
    sa = sa_old - delta_v / v_sa;
    if (sa < 0e0 || sa > 50e0)
      sa = 9e15;
  }
  return (sa);
}
```