int set_swapd(p, d)
double *p;
double d;
{
  union {
    double d;
    unsigned char c[sizeof(double)];
  } u;
  unsigned char t;
  u.d = d;
  t = u.c[0];
  u.c[0] = u.c[7];
  u.c[7] = t;
  t = u.c[1];
  u.c[1] = u.c[6];
  u.c[6] = t;
  t = u.c[2];
  u.c[2] = u.c[5];
  u.c[5] = t;
  t = u.c[3];
  u.c[3] = u.c[4];
  u.c[4] = t;
  *p = u.d;
  return (0);
}


x86 assembly (clang, -O0):
<set_swapd>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x18(%rbp),%al
mov    %al,-0x19(%rbp)
mov    -0x11(%rbp),%al
mov    %al,-0x18(%rbp)
mov    -0x19(%rbp),%al
mov    %al,-0x11(%rbp)
mov    -0x17(%rbp),%al
mov    %al,-0x19(%rbp)
mov    -0x12(%rbp),%al
mov    %al,-0x17(%rbp)
mov    -0x19(%rbp),%al
mov    %al,-0x12(%rbp)
mov    -0x16(%rbp),%al
mov    %al,-0x19(%rbp)
mov    -0x13(%rbp),%al
mov    %al,-0x16(%rbp)
mov    -0x19(%rbp),%al
mov    %al,-0x13(%rbp)
mov    -0x15(%rbp),%al
mov    %al,-0x19(%rbp)
mov    -0x14(%rbp),%al
mov    %al,-0x15(%rbp)
mov    -0x19(%rbp),%al
mov    %al,-0x14(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<set_swapd>:
movq   %xmm0,%rax
bswap  %rax
mov    %rax,(%rdi)
xor    %eax,%eax
ret

LLVM IR (-O0):
%union.anon = type { double }
define i32 @set_swapd(double* %0, double %1) {
%3 = alloca double*
%4 = alloca double
%5 = alloca %union.anon
%6 = alloca i8
store double* %0, double** %3
store double %1, double* %4
%7 = load double, double* %4
%8 = bitcast %union.anon* %5 to double*
store double %7, double* %8
%9 = bitcast %union.anon* %5 to [8 x i8]*
%10 = getelementptr inbounds [8 x i8], [8 x i8]* %9, i64 0, i64 0
%11 = load i8, i8* %10
store i8 %11, i8* %6
%12 = bitcast %union.anon* %5 to [8 x i8]*
%13 = getelementptr inbounds [8 x i8], [8 x i8]* %12, i64 0, i64 7
%14 = load i8, i8* %13
%15 = bitcast %union.anon* %5 to [8 x i8]*
%16 = getelementptr inbounds [8 x i8], [8 x i8]* %15, i64 0, i64 0
store i8 %14, i8* %16
%17 = load i8, i8* %6
%18 = bitcast %union.anon* %5 to [8 x i8]*
%19 = getelementptr inbounds [8 x i8], [8 x i8]* %18, i64 0, i64 7
store i8 %17, i8* %19
%20 = bitcast %union.anon* %5 to [8 x i8]*
%21 = getelementptr inbounds [8 x i8], [8 x i8]* %20, i64 0, i64 1
%22 = load i8, i8* %21
store i8 %22, i8* %6
%23 = bitcast %union.anon* %5 to [8 x i8]*
%24 = getelementptr inbounds [8 x i8], [8 x i8]* %23, i64 0, i64 6
%25 = load i8, i8* %24
%26 = bitcast %union.anon* %5 to [8 x i8]*
%27 = getelementptr inbounds [8 x i8], [8 x i8]* %26, i64 0, i64 1
store i8 %25, i8* %27
%28 = load i8, i8* %6
%29 = bitcast %union.anon* %5 to [8 x i8]*
%30 = getelementptr inbounds [8 x i8], [8 x i8]* %29, i64 0, i64 6
store i8 %28, i8* %30
%31 = bitcast %union.anon* %5 to [8 x i8]*
%32 = getelementptr inbounds [8 x i8], [8 x i8]* %31, i64 0, i64 2
%33 = load i8, i8* %32
store i8 %33, i8* %6
%34 = bitcast %union.anon* %5 to [8 x i8]*
%35 = getelementptr inbounds [8 x i8], [8 x i8]* %34, i64 0, i64 5
%36 = load i8, i8* %35
%37 = bitcast %union.anon* %5 to [8 x i8]*
%38 = getelementptr inbounds [8 x i8], [8 x i8]* %37, i64 0, i64 2
store i8 %36, i8* %38
%39 = load i8, i8* %6
%40 = bitcast %union.anon* %5 to [8 x i8]*
%41 = getelementptr inbounds [8 x i8], [8 x i8]* %40, i64 0, i64 5
store i8 %39, i8* %41
%42 = bitcast %union.anon* %5 to [8 x i8]*
%43 = getelementptr inbounds [8 x i8], [8 x i8]* %42, i64 0, i64 3
%44 = load i8, i8* %43
store i8 %44, i8* %6
%45 = bitcast %union.anon* %5 to [8 x i8]*
%46 = getelementptr inbounds [8 x i8], [8 x i8]* %45, i64 0, i64 4
%47 = load i8, i8* %46
%48 = bitcast %union.anon* %5 to [8 x i8]*
%49 = getelementptr inbounds [8 x i8], [8 x i8]* %48, i64 0, i64 3
store i8 %47, i8* %49
%50 = load i8, i8* %6
%51 = bitcast %union.anon* %5 to [8 x i8]*
%52 = getelementptr inbounds [8 x i8], [8 x i8]* %51, i64 0, i64 4
store i8 %50, i8* %52
%53 = bitcast %union.anon* %5 to double*
%54 = load double, double* %53
%55 = load double*, double** %3
store double %54, double* %55
ret i32 0
}

LLVM IR (-O2):
define i32 @set_swapd(double* nocapture writeonly %0, double %1) {
%3 = bitcast double %1 to i64
%4 = tail call i64 @llvm.bswap.i64(i64 %3)
%5 = bitcast double* %0 to i64*
store i64 %4, i64* %5
ret i32 0
}