user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<ieee_nextafter>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  movsd  %xmm0,-0x28(%rbp)
  movsd  %xmm1,-0x30(%rbp)
  lea    -0x28(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x18(%rbp)
  lea    -0x28(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    %eax,-0x14(%rbp)
  lea    -0x30(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x10(%rbp)
  lea    -0x30(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%eax
  and    $0x7fffffff,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x10(%rbp),%eax
  and    $0x7fffffff,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x7fefffff,-0x8(%rbp)
  jle    L61
  mov    -0x8(%rbp),%eax
  sub    $0x7ff00000,%eax
  or     -0x14(%rbp),%eax
  test   %eax,%eax
  jne    L330
L61:
  cmpl   $0x7fefffff,-0x4(%rbp)
  jle    L43
  mov    -0x4(%rbp),%eax
  sub    $0x7ff00000,%eax
  or     -0xc(%rbp),%eax
  test   %eax,%eax
  je     L43
L330:
  movsd  -0x28(%rbp),%xmm1
  movsd  -0x30(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  jmp    L250
L43:
  movsd  -0x28(%rbp),%xmm0
  movsd  -0x30(%rbp),%xmm1
  ucomisd %xmm1,%xmm0
  jp     L303
  ucomisd %xmm1,%xmm0
  jne    L303
  movsd  -0x28(%rbp),%xmm0
  jmp    L250
L303:
  mov    -0x8(%rbp),%eax
  or     -0x14(%rbp),%eax
  test   %eax,%eax
  jne    L158
  lea    -0x28(%rbp),%rax
  mov    -0x10(%rbp),%edx
  and    $0x80000000,%edx
  mov    %edx,(%rax)
  lea    -0x28(%rbp),%rax
  add    $0x4,%rax
  movl   $0x1,(%rax)
  movsd  -0x28(%rbp),%xmm1
  movsd  -0x28(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  -0x30(%rbp),%xmm0
  movsd  -0x28(%rbp),%xmm1
  ucomisd %xmm1,%xmm0
  jp     L298
  ucomisd %xmm1,%xmm0
  jne    L298
  movsd  -0x30(%rbp),%xmm0
  jmp    L250
L298:
  movsd  -0x28(%rbp),%xmm0
  jmp    L250
L158:
  cmpl   $0x0,-0x18(%rbp)
  js     L214
  mov    -0x18(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jg     L332
  mov    -0x18(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jne    L22
  mov    -0x14(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jbe    L22
L332:
  cmpl   $0x0,-0x14(%rbp)
  jne    L297
  subl   $0x1,-0x18(%rbp)
L297:
  subl   $0x1,-0x14(%rbp)
  jmp    L156
L22:
  addl   $0x1,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  jne    L156
  addl   $0x1,-0x18(%rbp)
  jmp    L156
L214:
  cmpl   $0x0,-0x10(%rbp)
  jns    L45
  mov    -0x18(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jg     L45
  mov    -0x18(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jne    L229
  mov    -0x14(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jbe    L229
L45:
  cmpl   $0x0,-0x14(%rbp)
  jne    L290
  subl   $0x1,-0x18(%rbp)
L290:
  subl   $0x1,-0x14(%rbp)
  jmp    L156
L229:
  addl   $0x1,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  jne    L156
  addl   $0x1,-0x18(%rbp)
L156:
  mov    -0x18(%rbp),%eax
  and    $0x7ff00000,%eax
  mov    %eax,-0x10(%rbp)
  cmpl   $0x7fefffff,-0x10(%rbp)
  jle    L335
  movsd  -0x28(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  jmp    L250
L335:
  cmpl   $0xfffff,-0x10(%rbp)
  jg     L92
  movsd  -0x28(%rbp),%xmm1
  movsd  -0x28(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  -0x30(%rbp),%xmm0
  movsd  -0x28(%rbp),%xmm1
  ucomisd %xmm1,%xmm0
  jp     L145
  ucomisd %xmm1,%xmm0
  je     L92
L145:
  lea    -0x30(%rbp),%rax
  mov    -0x18(%rbp),%edx
  mov    %edx,(%rax)
  lea    -0x30(%rbp),%rax
  add    $0x4,%rax
  mov    -0x14(%rbp),%edx
  mov    %edx,(%rax)
  movsd  -0x30(%rbp),%xmm0
  jmp    L250
L92:
  lea    -0x28(%rbp),%rax
  mov    -0x18(%rbp),%edx
  mov    %edx,(%rax)
  lea    -0x28(%rbp),%rax
  add    $0x4,%rax
  mov    -0x14(%rbp),%edx
  mov    %edx,(%rax)
  movsd  -0x28(%rbp),%xmm0
L250:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  pop    %rbp
  ret
```

assistant: ```c
double ieee_nextafter(double x, double y) {
  int hx, hy, ix, iy;
  unsigned lx, ly;
  hx = *(int *)&x;
  lx = *(1 + (int *)&x);
  hy = *(int *)&y;
  ly = *(1 + (int *)&y);
  ix = hx & 0x7fffffff;
  iy = hy & 0x7fffffff;
  if (((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) || ((iy >= 0x7ff00000) && ((iy - 0x7ff00000) | ly) != 0))
    return x + y;
  if (x == y)
    return x;
  if ((ix | lx) == 0) {
    *(int *)&x = hy & 0x80000000;
    *(1 + (int *)&x) = 1;
    y = x * x;
    if (y == x)
      return y;
    else
      return x;
  }
  if (hx >= 0) {
    if (hx > hy || ((hx == hy) && (lx > ly))) {
      if (lx == 0)
        hx -= 1;
      lx -= 1;
    } else {
      lx += 1;
      if (lx == 0)
        hx += 1;
    }
  } else {
    if (hy >= 0 || hx > hy || ((hx == hy) && (lx > ly))) {
      if (lx == 0)
        hx -= 1;
      lx -= 1;
    } else {
      lx += 1;
      if (lx == 0)
        hx += 1;
    }
  }
  hy = hx & 0x7ff00000;
  if (hy >= 0x7ff00000)
    return x + x;
  if (hy < 0x00100000) {
    y = x * x;
    if (y != x) {
      *(int *)&y = hx;
      *(1 + (int *)&y) = lx;
      return y;
    }
  }
  *(int *)&x = hx;
  *(1 + (int *)&x) = lx;
  return x;
}
```