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     L165
  ucomisd %xmm0,%xmm1
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  je     L165
L167:
  movq   $0x0,0x0(%rbp)
  movq   $0x0,(%rbx)
L122:
  add    $0x38,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  ret
  nopl   (%rax)
L165:
  ucomisd %xmm0,%xmm2
  mov    $0x0,%edx
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  je     L108
  ucomisd %xmm0,%xmm3
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  jne    L167
L108:
  comisd %xmm0,%xmm4
  jb     L35
  comisd %xmm0,%xmm2
  jae    L5
  comisd %xmm3,%xmm0
  movsd  %xmm4,0x8(%rsp)
  movapd %xmm2,%xmm1
  movapd %xmm5,%xmm0
  movsd  %xmm3,0x10(%rsp)
  jae    L76
  movsd  %xmm5,0x8(%rsp)
L77:
  mov    $0x2,%eax
  call   <mul_lo@plt>
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm3
  cvtsi2sd %eax,%xmm0
  movapd %xmm3,%xmm1
  movsd  %xmm0,0x0(%rbp)
L209:
  movsd  0x8(%rsp),%xmm5
L119:
  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)
L5:
  movsd  %xmm3,0x10(%rsp)
  movapd %xmm2,%xmm1
  movapd %xmm4,%xmm0
  movsd  %xmm5,0x8(%rsp)
  jmp    L77
  cs nopw 0x0(%rax,%rax,1)
L35:
  comisd %xmm5,%xmm0
  jae    L160
  comisd %xmm0,%xmm2
  jae    L186
  comisd %xmm3,%xmm0
  jae    L152
  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    L90
  movsd  %xmm6,0x0(%rbp)
L90:
  comisd (%rbx),%xmm0
  jbe    L122
  movsd  %xmm0,(%rbx)
  jmp    L122
  cs nopw 0x0(%rax,%rax,1)
L76:
  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)
L78:
  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)
L160:
  comisd %xmm0,%xmm2
  movsd  %xmm2,0x10(%rsp)
  jae    L15
  comisd %xmm3,%xmm0
  jae    L111
  movapd %xmm3,%xmm1
  movapd %xmm4,%xmm0
  movsd  %xmm4,0x8(%rsp)
L197:
  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    L78
  nopl   (%rax)
L111:
  movsd  %xmm4,0x8(%rsp)
  movapd %xmm3,%xmm1
  movapd %xmm5,%xmm0
  jmp    L197
L186:
  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    L119
L152:
  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    L78
L15:
  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    L209
```

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;
}
```