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

```asm
<enorm>:
  endbr64
  push   %rbx
  sub    $0x10,%rsp
  pxor   %xmm0,%xmm0
  cvtsi2sd %edi,%xmm0
  movsd  D44(%rip),%xmm13
  divsd  %xmm0,%xmm13
  test   %edi,%edi
  jle    L147
  mov    %rsi,%rax
  lea    -0x1(%rdi),%edx
  lea    0x8(%rsi,%rdx,8),%rdx
  mov    D83(%rip),%rbx
  mov    %rbx,0x8(%rsp)
  movq   %rbx,%xmm2
  movq   %rbx,%xmm6
  movq   %rbx,%xmm3
  movq   D49(%rip),%xmm5
  movsd  D76(%rip),%xmm4
  movsd  D8(%rip),%xmm11
  movapd %xmm4,%xmm7
  movq   %rbx,%xmm9
  movq   %rbx,%xmm10
  movapd %xmm11,%xmm8
  jmp    L27
L173:
  mulsd  %xmm1,%xmm1
  addsd  %xmm1,%xmm6
  jmp    L156
L65:
  comisd %xmm7,%xmm12
  ja     L246
  movq   %rbx,%xmm0
  comisd %xmm0,%xmm12
  jbe    L202
  divsd  %xmm12,%xmm0
  mulsd  %xmm0,%xmm2
  mulsd  %xmm0,%xmm2
  addsd  %xmm8,%xmm2
  movq   %xmm12,%rbx
L156:
  add    $0x8,%rax
  cmp    %rax,%rdx
  je     L166
L27:
  movsd  (%rax),%xmm1
  movapd %xmm1,%xmm12
  andpd  %xmm5,%xmm12
  comisd %xmm4,%xmm12
  jbe    L65
  comisd %xmm12,%xmm13
  ja     L173
L246:
  movsd  0x8(%rsp),%xmm0
  comisd %xmm0,%xmm12
  jbe    L14
  divsd  %xmm12,%xmm0
  mulsd  %xmm0,%xmm3
  mulsd  %xmm0,%xmm3
  addsd  %xmm11,%xmm3
  movsd  %xmm12,0x8(%rsp)
  jmp    L156
L14:
  divsd  0x8(%rsp),%xmm1
  mulsd  %xmm1,%xmm1
  addsd  %xmm1,%xmm3
  jmp    L156
L202:
  ucomisd %xmm9,%xmm1
  jp     L112
  ucomisd %xmm10,%xmm1
  je     L156
L112:
  movq   %rbx,%xmm0
  divsd  %xmm0,%xmm1
  mulsd  %xmm1,%xmm1
  addsd  %xmm1,%xmm2
  jmp    L156
L166:
  ucomisd D83(%rip),%xmm3
  jp     L242
  jne    L242
  ucomisd D83(%rip),%xmm6
  jp     L276
  je     L71
L276:
  movq   %rbx,%xmm7
  comisd %xmm7,%xmm6
  jb     L279
  movq   %rbx,%xmm1
  divsd  %xmm6,%xmm1
  movq   %rbx,%xmm0
  mulsd  %xmm2,%xmm0
  mulsd  %xmm0,%xmm1
  addsd  D8(%rip),%xmm1
  mulsd  %xmm6,%xmm1
  movapd %xmm1,%xmm0
L58:
  pxor   %xmm1,%xmm1
  ucomisd %xmm0,%xmm1
  ja     L194
  sqrtsd %xmm0,%xmm0
L31:
  add    $0x10,%rsp
  pop    %rbx
  ret
L242:
  movsd  0x8(%rsp),%xmm7
  divsd  %xmm7,%xmm6
  movapd %xmm6,%xmm0
  divsd  %xmm7,%xmm0
  addsd  %xmm3,%xmm0
  pxor   %xmm1,%xmm1
  ucomisd %xmm0,%xmm1
  ja     L195
  sqrtsd %xmm0,%xmm0
L22:
  mulsd  0x8(%rsp),%xmm0
  jmp    L31
L195:
  call   <sqrt@plt>
  jmp    L22
L279:
  divsd  %xmm7,%xmm6
  mulsd  %xmm7,%xmm2
  addsd  %xmm2,%xmm6
  movq   %rbx,%xmm0
  mulsd  %xmm6,%xmm0
  jmp    L58
L194:
  call   <sqrt@plt>
  jmp    L31
L71:
  pxor   %xmm0,%xmm0
  ucomisd %xmm2,%xmm0
  ja     L259
L208:
  sqrtsd %xmm2,%xmm2
L186:
  movq   %rbx,%xmm0
  mulsd  %xmm2,%xmm0
  jmp    L31
L147:
  mov    D83(%rip),%rbx
  movq   %rbx,%xmm2
  jmp    L208
L259:
  movapd %xmm2,%xmm0
  call   <sqrt@plt>
  movapd %xmm0,%xmm2
  jmp    L186
```

tool_calls: name: parse_data
arguments: label: D44
type: f64
name: parse_data
arguments: label: D83
type: f64
name: parse_data
arguments: label: D49
type: qword
name: parse_data
arguments: label: D76
type: byte[8]
name: parse_data
arguments: label: D8
type: f64

tool: D44: 1.304e+19

tool: D83: 0

tool: D49: 9223372036854775807

tool: {"D76": [0x29,0x80,0xd9,0xe8,0xc6,0xa1,0xe6,0x3b]}

tool: D8: 1

assistant: ```c
double enorm(int n, double x[]) {
  int i;
  double agiant;
  double floatn;
  double s1;
  double s2;
  double s3;
  double xabs;
  double x1max;
  double x3max;
  double ans;
  double temp;
  static double rdwarf = 3.834e-20;
  static double rgiant = 1.304e19;
  static double zero = 0.0;
  static double one = 1.0;
  s1 = zero;
  s2 = zero;
  s3 = zero;
  x1max = zero;
  x3max = zero;
  floatn = n;
  agiant = rgiant / floatn;
  for (i = 0; i < n; i++) {
    xabs = fabs(x[i]);
    if ((xabs > rdwarf) && (xabs < agiant)) {
      s2 += xabs * xabs;
      continue;
    }
    if (xabs > rdwarf) {
      if (xabs > x1max) {
        temp = x1max / xabs;
        s1 = one + s1 * temp * temp;
        x1max = xabs;
      } else {
        temp = xabs / x1max;
        s1 += temp * temp;
      }
      continue;
    }
    if (xabs > x3max) {
      temp = x3max / xabs;
      s3 = one + s3 * temp * temp;
      x3max = xabs;
    } else {
      if (xabs != zero) {
        temp = xabs / x3max;
        s3 += temp * temp;
      }
    }
  }
  if (s1 != zero) {
    temp = s1 + (s2 / x1max) / x1max;
    ans = x1max * sqrt(temp);
    return ans;
  }
  if (s2 != zero) {
    if (s2 >= x3max)
      temp = s2 * (one + (x3max / s2) * (x3max * s3));
    else
      temp = x3max * ((s2 / x3max) + (x3max * s3));
    ans = sqrt(temp);
  } else {
    ans = x3max * sqrt(s3);
  }
  return ans;
}
```