#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int /*<<< orphan*/ const int64_t;

/* Variables and functions */
int /*<<< orphan*/ endswap_int64_t_array(int /*<<< orphan*/ const *, int);
void endswap_int64_t_copy(int64_t *dest, const int64_t *src, int len) {
  const unsigned char *psrc;
  unsigned char *pdest;
  if (dest == src) {
    endswap_int64_t_array(dest, len);
    return;
  };
  psrc = ((const unsigned char *)src) + 8 * len;
  pdest = ((unsigned char *)dest) + 8 * len;
  while (--len >= 0) {
    psrc -= 8;
    pdest -= 8;
    pdest[0] = psrc[7];
    pdest[2] = psrc[5];
    pdest[4] = psrc[3];
    pdest[6] = psrc[1];
    pdest[7] = psrc[0];
    pdest[1] = psrc[6];
    pdest[3] = psrc[4];
    pdest[5] = psrc[2];
  };
}


x86 assembly (clang, -O0):
<endswap_int64_t_copy>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
jne    1142 <endswap_int64_t_copy+0x32>
mov    -0x8(%rbp),%rdi
mov    -0x14(%rbp),%esi
call   1030 <endswap_int64_t_array@plt>
jmp    1207 <endswap_int64_t_copy+0xf7>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x3,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x3,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jl     1207 <endswap_int64_t_copy+0xf7>
mov    -0x20(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    0x7(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    0x5(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x2(%rax)
mov    -0x20(%rbp),%rax
mov    0x3(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x4(%rax)
mov    -0x20(%rbp),%rax
mov    0x1(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x6(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x7(%rax)
mov    -0x20(%rbp),%rax
mov    0x6(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x1(%rax)
mov    -0x20(%rbp),%rax
mov    0x4(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x3(%rax)
mov    -0x20(%rbp),%rax
mov    0x2(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,0x5(%rax)
jmp    116a <endswap_int64_t_copy+0x5a>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<endswap_int64_t_copy>:
cmp    %rsi,%rdi
je     1193 <endswap_int64_t_copy+0x83>
test   %edx,%edx
jle    1192 <endswap_int64_t_copy+0x82>
lea    0x0(,%rdx,8),%eax
movslq %eax,%rcx
add    %rcx,%rdi
add    $0xffffffffffffffff,%rdi
add    %rsi,%rcx
add    $0xffffffffffffffff,%rcx
add    $0x1,%edx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
movzbl (%rcx,%rsi,8),%eax
mov    %al,-0x7(%rdi,%rsi,8)
movzbl -0x2(%rcx,%rsi,8),%eax
mov    %al,-0x5(%rdi,%rsi,8)
movzbl -0x4(%rcx,%rsi,8),%eax
mov    %al,-0x3(%rdi,%rsi,8)
movzbl -0x6(%rcx,%rsi,8),%eax
mov    %al,-0x1(%rdi,%rsi,8)
movzbl -0x7(%rcx,%rsi,8),%eax
mov    %al,(%rdi,%rsi,8)
movzbl -0x1(%rcx,%rsi,8),%eax
mov    %al,-0x6(%rdi,%rsi,8)
movzbl -0x3(%rcx,%rsi,8),%eax
mov    %al,-0x4(%rdi,%rsi,8)
movzbl -0x5(%rcx,%rsi,8),%eax
mov    %al,-0x2(%rdi,%rsi,8)
add    $0xffffffffffffffff,%rsi
lea    (%rdx,%rsi,1),%eax
cmp    $0x1,%eax
ja     1140 <endswap_int64_t_copy+0x30>
ret
mov    %edx,%esi
jmp    1030 <endswap_int64_t_array@plt>

LLVM IR (-O0):
define void @endswap_int64_t_copy(i32* %0, i32* %1, i32 %2) {
%4 = alloca i32*
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i8*
store i32* %0, i32** %4
store i32* %1, i32** %5
store i32 %2, i32* %6
%9 = load i32*, i32** %4
%10 = load i32*, i32** %5
%11 = icmp eq i32* %9, %10
br i1 %11, label %12, label %16
12: ; preds = %3
%13 = load i32*, i32** %4
%14 = load i32, i32* %6
%15 = call i32 @endswap_int64_t_array(i32* %13, i32 %14)
br label %78
16: ; preds = %3
%17 = load i32*, i32** %5
%18 = bitcast i32* %17 to i8*
%19 = load i32, i32* %6
%20 = mul nsw i32 8, %19
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i8, i8* %18, i64 %21
store i8* %22, i8** %7
%23 = load i32*, i32** %4
%24 = bitcast i32* %23 to i8*
%25 = load i32, i32* %6
%26 = mul nsw i32 8, %25
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i8, i8* %24, i64 %27
store i8* %28, i8** %8
br label %29
29: ; preds = %33, %16
%30 = load i32, i32* %6
%31 = add nsw i32 %30, -1
store i32 %31, i32* %6
%32 = icmp sge i32 %31, 0
br i1 %32, label %33, label %78
33: ; preds = %29
%34 = load i8*, i8** %7
%35 = getelementptr inbounds i8, i8* %34, i64 -8
store i8* %35, i8** %7
%36 = load i8*, i8** %8
%37 = getelementptr inbounds i8, i8* %36, i64 -8
store i8* %37, i8** %8
%38 = load i8*, i8** %7
%39 = getelementptr inbounds i8, i8* %38, i64 7
%40 = load i8, i8* %39
%41 = load i8*, i8** %8
%42 = getelementptr inbounds i8, i8* %41, i64 0
store i8 %40, i8* %42
%43 = load i8*, i8** %7
%44 = getelementptr inbounds i8, i8* %43, i64 5
%45 = load i8, i8* %44
%46 = load i8*, i8** %8
%47 = getelementptr inbounds i8, i8* %46, i64 2
store i8 %45, i8* %47
%48 = load i8*, i8** %7
%49 = getelementptr inbounds i8, i8* %48, i64 3
%50 = load i8, i8* %49
%51 = load i8*, i8** %8
%52 = getelementptr inbounds i8, i8* %51, i64 4
store i8 %50, i8* %52
%53 = load i8*, i8** %7
%54 = getelementptr inbounds i8, i8* %53, i64 1
%55 = load i8, i8* %54
%56 = load i8*, i8** %8
%57 = getelementptr inbounds i8, i8* %56, i64 6
store i8 %55, i8* %57
%58 = load i8*, i8** %7
%59 = getelementptr inbounds i8, i8* %58, i64 0
%60 = load i8, i8* %59
%61 = load i8*, i8** %8
%62 = getelementptr inbounds i8, i8* %61, i64 7
store i8 %60, i8* %62
%63 = load i8*, i8** %7
%64 = getelementptr inbounds i8, i8* %63, i64 6
%65 = load i8, i8* %64
%66 = load i8*, i8** %8
%67 = getelementptr inbounds i8, i8* %66, i64 1
store i8 %65, i8* %67
%68 = load i8*, i8** %7
%69 = getelementptr inbounds i8, i8* %68, i64 4
%70 = load i8, i8* %69
%71 = load i8*, i8** %8
%72 = getelementptr inbounds i8, i8* %71, i64 3
store i8 %70, i8* %72
%73 = load i8*, i8** %7
%74 = getelementptr inbounds i8, i8* %73, i64 2
%75 = load i8, i8* %74
%76 = load i8*, i8** %8
%77 = getelementptr inbounds i8, i8* %76, i64 5
store i8 %75, i8* %77
br label %29
78: ; preds = %12, %29
ret void
}

LLVM IR (-O2):
define void @endswap_int64_t_copy(i32* %0, i32* %1, i32 %2) {
%4 = icmp eq i32* %0, %1
br i1 %4, label %5, label %7
5: ; preds = %3
%6 = tail call i32 @endswap_int64_t_array(i32* %0, i32 %2)
br label %46
7: ; preds = %3
%8 = shl nsw i32 %2, 3
%9 = sext i32 %8 to i64
%10 = icmp sgt i32 %2, 0
br i1 %10, label %11, label %46
11: ; preds = %7
%12 = bitcast i32* %0 to i8*
%13 = getelementptr inbounds i8, i8* %12, i64 %9
%14 = bitcast i32* %1 to i8*
%15 = getelementptr inbounds i8, i8* %14, i64 %9
br label %16
16: ; preds = %11, %16
%17 = phi i8* [ %22, %16 ], [ %13, %11 ]
%18 = phi i8* [ %21, %16 ], [ %15, %11 ]
%19 = phi i32 [ %20, %16 ], [ %2, %11 ]
%20 = add nsw i32 %19, -1
%21 = getelementptr inbounds i8, i8* %18, i64 -8
%22 = getelementptr inbounds i8, i8* %17, i64 -8
%23 = getelementptr inbounds i8, i8* %18, i64 -1
%24 = load i8, i8* %23
store i8 %24, i8* %22
%25 = getelementptr inbounds i8, i8* %18, i64 -3
%26 = load i8, i8* %25
%27 = getelementptr inbounds i8, i8* %17, i64 -6
store i8 %26, i8* %27
%28 = getelementptr inbounds i8, i8* %18, i64 -5
%29 = load i8, i8* %28
%30 = getelementptr inbounds i8, i8* %17, i64 -4
store i8 %29, i8* %30
%31 = getelementptr inbounds i8, i8* %18, i64 -7
%32 = load i8, i8* %31
%33 = getelementptr inbounds i8, i8* %17, i64 -2
store i8 %32, i8* %33
%34 = load i8, i8* %21
%35 = getelementptr inbounds i8, i8* %17, i64 -1
store i8 %34, i8* %35
%36 = getelementptr inbounds i8, i8* %18, i64 -2
%37 = load i8, i8* %36
%38 = getelementptr inbounds i8, i8* %17, i64 -7
store i8 %37, i8* %38
%39 = getelementptr inbounds i8, i8* %18, i64 -4
%40 = load i8, i8* %39
%41 = getelementptr inbounds i8, i8* %17, i64 -5
store i8 %40, i8* %41
%42 = getelementptr inbounds i8, i8* %18, i64 -6
%43 = load i8, i8* %42
%44 = getelementptr inbounds i8, i8* %17, i64 -3
store i8 %43, i8* %44
%45 = icmp ugt i32 %19, 1
br i1 %45, label %16, label %46
46: ; preds = %16, %7, %5
ret void
}