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

```asm
<interval_mul4>:
  endbr64
  push   %rbp
  movapd %xmm0,%xmm4
  pxor   %xmm0,%xmm0
  mov    $0x0,%edx
  push   %rbx
  movapd %xmm1,%xmm5
  mov    %rdi,%rbp
  mov    %rsi,%rbx
  sub    $0x38,%rsp
  ucomisd %xmm0,%xmm4
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  je     L152
  ucomisd %xmm0,%xmm1
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  je     L152
L187:
  movq   $0x0,0x0(%rbp)
  movq   $0x0,(%rbx)
L1:
  add    $0x38,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  ret
  nopl   (%rax)
L152:
  ucomisd %xmm0,%xmm2
  mov    $0x0,%edx
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  je     L198
  ucomisd %xmm0,%xmm3
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  jne    L187
L198:
  comisd %xmm0,%xmm4
  jb     L92
  comisd %xmm0,%xmm2
  jae    L29
  comisd %xmm3,%xmm0
  movsd  %xmm4,0x8(%rsp)
  movapd %xmm2,%xmm1
  movapd %xmm5,%xmm0
  movsd  %xmm3,0x10(%rsp)
  jae    L91
  movsd  %xmm5,0x8(%rsp)
L163:
  mov    $0x2,%eax
  call   <mul_lo@plt>
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm3
  cvtsi2sd %eax,%xmm0
  movapd %xmm3,%xmm1
  movsd  %xmm0,0x0(%rbp)
L58:
  movsd  0x8(%rsp),%xmm5
L39:
  movapd %xmm5,%xmm0
  mov    $0x2,%eax
  call   <mul_hi@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  xor    %eax,%eax
  movsd  %xmm0,(%rbx)
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopw   0x0(%rax,%rax,1)
L29:
  movsd  %xmm3,0x10(%rsp)
  movapd %xmm2,%xmm1
  movapd %xmm4,%xmm0
  movsd  %xmm5,0x8(%rsp)
  jmp    L163
  cs nopw 0x0(%rax,%rax,1)
L92:
  comisd %xmm5,%xmm0
  jae    L90
  comisd %xmm0,%xmm2
  jae    L114
  comisd %xmm3,%xmm0
  jae    L9
  movapd %xmm5,%xmm0
  movapd %xmm2,%xmm1
  mov    $0x2,%eax
  movsd  %xmm5,0x20(%rsp)
  movsd  %xmm2,0x28(%rsp)
  movsd  %xmm3,0x10(%rsp)
  movsd  %xmm4,0x8(%rsp)
  call   <mul_lo@plt>
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm3
  movsd  0x8(%rsp),%xmm4
  cvtsi2sd %eax,%xmm0
  mov    $0x2,%eax
  movapd %xmm3,%xmm1
  movsd  %xmm3,0x18(%rsp)
  movsd  %xmm4,0x10(%rsp)
  movsd  %xmm0,0x0(%rbp)
  movapd %xmm4,%xmm0
  call   <mul_lo@plt>
  pxor   %xmm6,%xmm6
  movsd  0x28(%rsp),%xmm2
  movsd  0x10(%rsp),%xmm4
  cvtsi2sd %eax,%xmm6
  mov    $0x2,%eax
  movapd %xmm2,%xmm1
  movapd %xmm4,%xmm0
  movsd  %xmm6,0x8(%rsp)
  call   <mul_hi@plt>
  pxor   %xmm0,%xmm0
  movsd  0x18(%rsp),%xmm3
  movsd  0x20(%rsp),%xmm5
  cvtsi2sd %eax,%xmm0
  mov    $0x2,%eax
  movapd %xmm3,%xmm1
  movsd  %xmm0,(%rbx)
  movapd %xmm5,%xmm0
  call   <mul_hi@plt>
  movsd  0x0(%rbp),%xmm1
  movsd  0x8(%rsp),%xmm6
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  comisd %xmm6,%xmm1
  jbe    L162
  movsd  %xmm6,0x0(%rbp)
L162:
  comisd (%rbx),%xmm0
  jbe    L1
  movsd  %xmm0,(%rbx)
  jmp    L1
  cs nopw 0x0(%rax,%rax,1)
L91:
  mov    $0x2,%eax
  call   <mul_lo@plt>
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm3
  movsd  0x8(%rsp),%xmm4
  cvtsi2sd %eax,%xmm0
  movapd %xmm3,%xmm1
  movsd  %xmm0,0x0(%rbp)
L73:
  movapd %xmm4,%xmm0
  mov    $0x2,%eax
  call   <mul_hi@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  xor    %eax,%eax
  movsd  %xmm0,(%rbx)
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopw   0x0(%rax,%rax,1)
L90:
  comisd %xmm0,%xmm2
  movsd  %xmm2,0x10(%rsp)
  jae    L86
  comisd %xmm3,%xmm0
  jae    L42
  movapd %xmm3,%xmm1
  movapd %xmm4,%xmm0
  movsd  %xmm4,0x8(%rsp)
L179:
  mov    $0x2,%eax
  call   <mul_lo@plt>
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm2
  movsd  0x8(%rsp),%xmm4
  cvtsi2sd %eax,%xmm0
  movapd %xmm2,%xmm1
  movsd  %xmm0,0x0(%rbp)
  jmp    L73
  nopl   (%rax)
L42:
  movsd  %xmm4,0x8(%rsp)
  movapd %xmm3,%xmm1
  movapd %xmm5,%xmm0
  jmp    L179
L114:
  movapd %xmm3,%xmm1
  movapd %xmm4,%xmm0
  mov    $0x2,%eax
  movsd  %xmm5,0x10(%rsp)
  movsd  %xmm3,0x8(%rsp)
  call   <mul_lo@plt>
  pxor   %xmm0,%xmm0
  movsd  0x8(%rsp),%xmm3
  movsd  0x10(%rsp),%xmm5
  cvtsi2sd %eax,%xmm0
  movapd %xmm3,%xmm1
  movsd  %xmm0,0x0(%rbp)
  jmp    L39
L9:
  movapd %xmm2,%xmm1
  movapd %xmm5,%xmm0
  mov    $0x2,%eax
  movsd  %xmm4,0x10(%rsp)
  movsd  %xmm2,0x8(%rsp)
  call   <mul_lo@plt>
  pxor   %xmm0,%xmm0
  movsd  0x8(%rsp),%xmm2
  movsd  0x10(%rsp),%xmm4
  cvtsi2sd %eax,%xmm0
  movapd %xmm2,%xmm1
  movsd  %xmm0,0x0(%rbp)
  jmp    L73
L86:
  movapd %xmm3,%xmm1
  movapd %xmm4,%xmm0
  mov    $0x2,%eax
  movsd  %xmm5,0x8(%rsp)
  call   <mul_lo@plt>
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm2
  cvtsi2sd %eax,%xmm0
  movapd %xmm2,%xmm1
  movsd  %xmm0,0x0(%rbp)
  jmp    L58
```

assistant: ```c
int interval_mul4(x1, x2, y1, y2, low, high)
double x1, x2, y1, y2, *low, *high;
{
  double lo, hi;
  if (((x1 == 0.0) && (x2 == 0.0)) || ((y1 == 0.0) && (y2 == 0.0))) {
    *low = 0.0;
    *high = 0.0;
    return 0;
  }
  if (x1 >= 0.0) {
    if (y1 >= 0.0) {
      *low = mul_lo(x1, y1);
      *high = mul_hi(x2, y2);
      return 0;
    }
    if (y2 <= 0.0) {
      *low = mul_lo(x2, y1);
      *high = mul_hi(x1, y2);
      return 0;
    }
    *low = mul_lo(x2, y1);
    *high = mul_hi(x2, y2);
    return 0;
  }
  if (x2 <= 0.0) {
    if (y1 >= 0.0) {
      *low = mul_lo(x1, y2);
      *high = mul_hi(x2, y1);
      return 0;
    }
    if (y2 <= 0.0) {
      *low = mul_lo(x2, y2);
      *high = mul_hi(x1, y1);
      return 0;
    }
    *low = mul_lo(x1, y2);
    *high = mul_hi(x1, y1);
    return 0;
  }
  if (y1 >= 0.0) {
    *low = mul_lo(x1, y2);
    *high = mul_hi(x2, y2);
    return 0;
  }
  if (y2 <= 0.0) {
    *low = mul_lo(x2, y1);
    *high = mul_hi(x1, y1);
    return 0;
  }
  *low = mul_lo(x2, y1);
  lo = mul_lo(x1, y2);
  *high = mul_hi(x1, y1);
  hi = mul_hi(x2, y2);
  if (lo < *low)
    *low = lo;
  if (hi > *high)
    *high = hi;
  return 0;
}
```