user: 下面的汇编指令对应的C源代码是什么:

```asm
<xdr_double>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x82,%eax
  je     L128
  cmp    $0x82,%eax
  jg     L152
  cmp    $0x80,%eax
  je     L72
  cmp    $0x81,%eax
  jne    L152
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    D25(%rip),%rax
  mov    (%rax),%edx
  mov    D64(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  je     L134
  mov    $0x4,%edx
  jmp    L5
L134:
  mov    $0x0,%edx
L5:
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  mov    %rax,-0x20(%rbp)
  mov    D25(%rip),%rax
  mov    (%rax),%edx
  mov    D64(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jne    L146
  mov    $0x4,%edx
  jmp    L11
L146:
  mov    $0x0,%edx
L11:
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  mov    %rax,-0x18(%rbp)
  lea    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <XDR_PUTLONG@plt>
  test   %eax,%eax
  je     L90
  lea    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    -0x38(%rbp),%rdx
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <XDR_PUTLONG@plt>
  test   %eax,%eax
  je     L90
  mov    $0x1,%eax
  jmp    L191
L90:
  mov    $0x0,%eax
  jmp    L191
L128:
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    D25(%rip),%rax
  mov    (%rax),%edx
  mov    D64(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  je     L35
  mov    $0x8,%edx
  jmp    L206
L35:
  mov    $0x0,%edx
L206:
  lea    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <XDR_GETLONG@plt>
  test   %eax,%eax
  je     L70
  mov    D25(%rip),%rax
  mov    (%rax),%edx
  mov    D64(%rip),%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jne    L26
  mov    $0x8,%edx
  jmp    L41
L26:
  mov    $0x0,%edx
L41:
  lea    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <XDR_GETLONG@plt>
  test   %eax,%eax
  je     L70
  mov    -0x20(%rbp),%rax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  mov    %edx,(%rax)
  mov    $0x1,%eax
  jmp    L191
L72:
  mov    $0x1,%eax
  jmp    L191
L70:
  nop
L152:
  mov    $0x0,%eax
L191:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L167
  call   <__stack_chk_fail@plt>
L167:
  leave
  ret
```

assistant: ```c
bool_t xdr_double(XDR *xdrs, double *dp) {
  switch (xdrs->x_op) {
  case XDR_ENCODE:
    if (2 * sizeof(long) == sizeof(double)) {
      long *lp = (long *)dp;
      return (XDR_PUTLONG(xdrs, lp + !(__FLOAT_WORD_ORDER == __BIG_ENDIAN)) && XDR_PUTLONG(xdrs, lp + (__FLOAT_WORD_ORDER == __BIG_ENDIAN)));
    } else if (2 * sizeof(int) == sizeof(double)) {
      int *ip = (int *)dp;
      long tmp[2];
      tmp[0] = ip[!(__FLOAT_WORD_ORDER == __BIG_ENDIAN)];
      tmp[1] = ip[(__FLOAT_WORD_ORDER == __BIG_ENDIAN)];
      return (XDR_PUTLONG(xdrs, tmp) && XDR_PUTLONG(xdrs, tmp + 1));
    }
    break;
  case XDR_DECODE:
    if (2 * sizeof(long) == sizeof(double)) {
      long *lp = (long *)dp;
      return (XDR_GETLONG(xdrs, lp + !(__FLOAT_WORD_ORDER == __BIG_ENDIAN)) && XDR_GETLONG(xdrs, lp + (__FLOAT_WORD_ORDER == __BIG_ENDIAN)));
    } else if (2 * sizeof(int) == sizeof(double)) {
      int *ip = (int *)dp;
      long tmp[2];
      if (XDR_GETLONG(xdrs, tmp + !(__FLOAT_WORD_ORDER == __BIG_ENDIAN)) && XDR_GETLONG(xdrs, tmp + (__FLOAT_WORD_ORDER == __BIG_ENDIAN))) {
        ip[0] = tmp[0];
        ip[1] = tmp[1];
        return ((1));
      }
    }
    break;
  case XDR_FREE:
    return ((1));
  }
  return ((0));
}
```