#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*/ mp_size_t;
typedef int /*<<< orphan*/ mp_limb_t;

/* Variables and functions */
void mpfq_copyd(mp_limb_t *dst, const mp_limb_t *src, mp_size_t n) {
  for (dst += n, src += n; n--;)
    *--dst = *--src;
}


x86 assembly (clang, -O0):
<mpfq_copyd>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
je     1176 <mpfq_copyd+0x76>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffffc,%rcx
mov    %rcx,-0x10(%rbp)
mov    -0x4(%rax),%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0xfffffffffffffffc,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,-0x4(%rax)
jmp    1139 <mpfq_copyd+0x39>
pop    %rbp
ret

x86 assembly (clang, -O2):
<mpfq_copyd>:
push   %r14
push   %rbx
test   %edx,%edx
je     1288 <mpfq_copyd+0x188>
movslq %edx,%r11
lea    (%rsi,%r11,4),%rax
lea    (%rdi,%r11,4),%rcx
lea    -0x1(%rdx),%r8d
cmp    $0x7,%r8d
jb     11f6 <mpfq_copyd+0xf6>
mov    %r8,%r9
not    %r9
add    %r11,%r9
lea    (%rdi,%r9,4),%rbx
cmp    %rax,%rbx
jae    1143 <mpfq_copyd+0x43>
lea    (%rsi,%r9,4),%rbx
cmp    %rcx,%rbx
jb     11f6 <mpfq_copyd+0xf6>
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffff8,%r9
lea    -0x8(%r9),%rbx
mov    %rbx,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rbx,%rbx
je     128c <mpfq_copyd+0x18c>
mov    %r10,%rbx
and    $0xfffffffffffffffe,%rbx
lea    (%rdi,%r11,4),%r14
add    $0xfffffffffffffff0,%r14
lea    (%rsi,%r11,4),%rdi
add    $0xfffffffffffffff0,%rdi
xor    %esi,%esi
nop
movups -0x10(%rdi,%rsi,4),%xmm0
movups (%rdi,%rsi,4),%xmm1
movups %xmm1,(%r14,%rsi,4)
movups %xmm0,-0x10(%r14,%rsi,4)
movups -0x30(%rdi,%rsi,4),%xmm0
movups -0x20(%rdi,%rsi,4),%xmm1
movups %xmm1,-0x20(%r14,%rsi,4)
movups %xmm0,-0x30(%r14,%rsi,4)
add    $0xfffffffffffffff0,%rsi
add    $0xfffffffffffffffe,%rbx
jne    1180 <mpfq_copyd+0x80>
neg    %rsi
test   $0x1,%r10b
je     11dd <mpfq_copyd+0xdd>
shl    $0x2,%rsi
mov    %rax,%rdi
sub    %rsi,%rdi
mov    %rcx,%rbx
sub    %rsi,%rbx
movups -0x20(%rdi),%xmm0
movups -0x10(%rdi),%xmm1
movups %xmm1,-0x10(%rbx)
movups %xmm0,-0x20(%rbx)
cmp    %r9,%r8
je     1288 <mpfq_copyd+0x188>
mov    %r9,%rsi
shl    $0x2,%rsi
sub    %r9d,%edx
sub    %rsi,%rax
sub    %rsi,%rcx
lea    -0x1(%rdx),%r8d
mov    %edx,%edi
and    $0x7,%edi
je     1227 <mpfq_copyd+0x127>
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    -0x4(%rax),%esi
add    $0xfffffffffffffffc,%rax
mov    %esi,-0x4(%rcx)
add    $0xfffffffffffffffc,%rcx
add    $0x1,%ebx
cmp    %ebx,%edi
jne    1210 <mpfq_copyd+0x110>
sub    %ebx,%edx
cmp    $0x7,%r8d
jb     1288 <mpfq_copyd+0x188>
neg    %edx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    -0x4(%rax,%rsi,4),%edi
mov    %edi,-0x4(%rcx,%rsi,4)
mov    -0x8(%rax,%rsi,4),%edi
mov    %edi,-0x8(%rcx,%rsi,4)
mov    -0xc(%rax,%rsi,4),%edi
mov    %edi,-0xc(%rcx,%rsi,4)
mov    -0x10(%rax,%rsi,4),%edi
mov    %edi,-0x10(%rcx,%rsi,4)
mov    -0x14(%rax,%rsi,4),%edi
mov    %edi,-0x14(%rcx,%rsi,4)
mov    -0x18(%rax,%rsi,4),%edi
mov    %edi,-0x18(%rcx,%rsi,4)
mov    -0x1c(%rax,%rsi,4),%edi
mov    %edi,-0x1c(%rcx,%rsi,4)
mov    -0x20(%rax,%rsi,4),%edi
mov    %edi,-0x20(%rcx,%rsi,4)
add    $0xfffffffffffffff8,%rsi
cmp    %esi,%edx
jne    1240 <mpfq_copyd+0x140>
pop    %rbx
pop    %r14
ret
xor    %esi,%esi
test   $0x1,%r10b
jne    11bd <mpfq_copyd+0xbd>
jmp    11dd <mpfq_copyd+0xdd>

LLVM IR (-O0):
define void @mpfq_copyd(i32* %0, i32* %1, i32 %2) {
%4 = alloca i32*
%5 = alloca i32*
%6 = alloca i32
store i32* %0, i32** %4
store i32* %1, i32** %5
store i32 %2, i32* %6
%7 = load i32, i32* %6
%8 = load i32*, i32** %4
%9 = sext i32 %7 to i64
%10 = getelementptr inbounds i32, i32* %8, i64 %9
store i32* %10, i32** %4
%11 = load i32, i32* %6
%12 = load i32*, i32** %5
%13 = sext i32 %11 to i64
%14 = getelementptr inbounds i32, i32* %12, i64 %13
store i32* %14, i32** %5
br label %15
15: ; preds = %19, %3
%16 = load i32, i32* %6
%17 = add nsw i32 %16, -1
store i32 %17, i32* %6
%18 = icmp ne i32 %16, 0
br i1 %18, label %19, label %25
19: ; preds = %15
%20 = load i32*, i32** %5
%21 = getelementptr inbounds i32, i32* %20, i32 -1
store i32* %21, i32** %5
%22 = load i32, i32* %21
%23 = load i32*, i32** %4
%24 = getelementptr inbounds i32, i32* %23, i32 -1
store i32* %24, i32** %4
store i32 %22, i32* %24
br label %15
25: ; preds = %15
ret void
}

LLVM IR (-O2):
define void @mpfq_copyd(i32* nocapture writeonly %0, i32* nocapture %1, i32 %2) {
%4 = sext i32 %2 to i64
%5 = icmp eq i32 %2, 0
br i1 %5, label %157, label %6
6: ; preds = %3
%7 = getelementptr i32, i32* %1, i64 %4
%8 = getelementptr i32, i32* %0, i64 %4
%9 = add i32 %2, -1
%10 = zext i32 %9 to i64
%11 = add nuw nsw i64 %10, 1
%12 = icmp ult i32 %9, 7
br i1 %12, label %104, label %13
13: ; preds = %6
%14 = add i32 %2, -1
%15 = zext i32 %14 to i64
%16 = xor i64 %15, -1
%17 = add nsw i64 %16, %4
%18 = getelementptr i32, i32* %0, i64 %17
%19 = getelementptr i32, i32* %1, i64 %17
%20 = icmp ult i32* %18, %7
%21 = icmp ult i32* %19, %8
%22 = and i1 %20, %21
br i1 %22, label %104, label %23
23: ; preds = %13
%24 = and i64 %11, 8589934584
%25 = trunc i64 %24 to i32
%26 = sub i32 %2, %25
%27 = sub nsw i64 0, %24
%28 = getelementptr i32, i32* %7, i64 %27
%29 = sub nsw i64 0, %24
%30 = getelementptr i32, i32* %8, i64 %29
%31 = add nsw i64 %24, -8
%32 = lshr exact i64 %31, 3
%33 = add nuw nsw i64 %32, 1
%34 = and i64 %33, 1
%35 = icmp eq i64 %31, 0
br i1 %35, label %80, label %36
36: ; preds = %23
%37 = and i64 %33, 4611686018427387902
%38 = getelementptr i32, i32* %7, i64 -1
%39 = getelementptr i32, i32* %8, i64 -1
%40 = getelementptr i32, i32* %7, i64 -1
%41 = getelementptr i32, i32* %8, i64 -1
br label %42
42: ; preds = %42, %36
%43 = phi i64 [ 0, %36 ], [ %77, %42 ]
%44 = phi i64 [ 0, %36 ], [ %78, %42 ]
%45 = sub i64 0, %43
%46 = sub i64 0, %43
%47 = getelementptr inbounds i32, i32* %38, i64 %45
%48 = getelementptr inbounds i32, i32* %47, i64 -3
%49 = bitcast i32* %48 to <4 x i32>*
%50 = load <4 x i32>, <4 x i32>* %49
%51 = getelementptr inbounds i32, i32* %47, i64 -4
%52 = getelementptr inbounds i32, i32* %51, i64 -3
%53 = bitcast i32* %52 to <4 x i32>*
%54 = load <4 x i32>, <4 x i32>* %53
%55 = getelementptr inbounds i32, i32* %39, i64 %46
%56 = getelementptr inbounds i32, i32* %55, i64 -3
%57 = bitcast i32* %56 to <4 x i32>*
store <4 x i32> %50, <4 x i32>* %57
%58 = getelementptr inbounds i32, i32* %55, i64 -4
%59 = getelementptr inbounds i32, i32* %58, i64 -3
%60 = bitcast i32* %59 to <4 x i32>*
store <4 x i32> %54, <4 x i32>* %60
%61 = sub nuw nsw i64 -8, %43
%62 = sub nuw nsw i64 -8, %43
%63 = getelementptr inbounds i32, i32* %40, i64 %61
%64 = getelementptr inbounds i32, i32* %63, i64 -3
%65 = bitcast i32* %64 to <4 x i32>*
%66 = load <4 x i32>, <4 x i32>* %65
%67 = getelementptr inbounds i32, i32* %63, i64 -4
%68 = getelementptr inbounds i32, i32* %67, i64 -3
%69 = bitcast i32* %68 to <4 x i32>*
%70 = load <4 x i32>, <4 x i32>* %69
%71 = getelementptr inbounds i32, i32* %41, i64 %62
%72 = getelementptr inbounds i32, i32* %71, i64 -3
%73 = bitcast i32* %72 to <4 x i32>*
store <4 x i32> %66, <4 x i32>* %73
%74 = getelementptr inbounds i32, i32* %71, i64 -4
%75 = getelementptr inbounds i32, i32* %74, i64 -3
%76 = bitcast i32* %75 to <4 x i32>*
store <4 x i32> %70, <4 x i32>* %76
%77 = add nuw i64 %43, 16
%78 = add i64 %44, 2
%79 = icmp eq i64 %78, %37
br i1 %79, label %80, label %42
80: ; preds = %42, %23
%81 = phi i64 [ 0, %23 ], [ %77, %42 ]
%82 = icmp eq i64 %34, 0
br i1 %82, label %102, label %83
83: ; preds = %80
%84 = sub i64 0, %81
%85 = getelementptr i32, i32* %7, i64 -1
%86 = sub i64 0, %81
%87 = getelementptr i32, i32* %8, i64 -1
%88 = getelementptr inbounds i32, i32* %85, i64 %84
%89 = getelementptr inbounds i32, i32* %88, i64 -3
%90 = bitcast i32* %89 to <4 x i32>*
%91 = load <4 x i32>, <4 x i32>* %90
%92 = getelementptr inbounds i32, i32* %88, i64 -4
%93 = getelementptr inbounds i32, i32* %92, i64 -3
%94 = bitcast i32* %93 to <4 x i32>*
%95 = load <4 x i32>, <4 x i32>* %94
%96 = getelementptr inbounds i32, i32* %87, i64 %86
%97 = getelementptr inbounds i32, i32* %96, i64 -3
%98 = bitcast i32* %97 to <4 x i32>*
store <4 x i32> %91, <4 x i32>* %98
%99 = getelementptr inbounds i32, i32* %96, i64 -4
%100 = getelementptr inbounds i32, i32* %99, i64 -3
%101 = bitcast i32* %100 to <4 x i32>*
store <4 x i32> %95, <4 x i32>* %101
br label %102
102: ; preds = %80, %83
%103 = icmp eq i64 %11, %24
br i1 %103, label %157, label %104
104: ; preds = %13, %6, %102
%105 = phi i32 [ %2, %13 ], [ %2, %6 ], [ %26, %102 ]
%106 = phi i32* [ %7, %13 ], [ %7, %6 ], [ %28, %102 ]
%107 = phi i32* [ %8, %13 ], [ %8, %6 ], [ %30, %102 ]
%108 = add i32 %105, -1
%109 = and i32 %105, 7
%110 = icmp eq i32 %109, 0
br i1 %110, label %122, label %111
111: ; preds = %104, %111
%112 = phi i32 [ %116, %111 ], [ %105, %104 ]
%113 = phi i32* [ %117, %111 ], [ %106, %104 ]
%114 = phi i32* [ %119, %111 ], [ %107, %104 ]
%115 = phi i32 [ %120, %111 ], [ 0, %104 ]
%116 = add nsw i32 %112, -1
%117 = getelementptr inbounds i32, i32* %113, i64 -1
%118 = load i32, i32* %117
%119 = getelementptr inbounds i32, i32* %114, i64 -1
store i32 %118, i32* %119
%120 = add i32 %115, 1
%121 = icmp eq i32 %120, %109
br i1 %121, label %122, label %111
122: ; preds = %111, %104
%123 = phi i32 [ %105, %104 ], [ %116, %111 ]
%124 = phi i32* [ %106, %104 ], [ %117, %111 ]
%125 = phi i32* [ %107, %104 ], [ %119, %111 ]
%126 = icmp ult i32 %108, 7
br i1 %126, label %157, label %127
127: ; preds = %122, %127
%128 = phi i32 [ %152, %127 ], [ %123, %122 ]
%129 = phi i32* [ %153, %127 ], [ %124, %122 ]
%130 = phi i32* [ %155, %127 ], [ %125, %122 ]
%131 = getelementptr inbounds i32, i32* %129, i64 -1
%132 = load i32, i32* %131
%133 = getelementptr inbounds i32, i32* %130, i64 -1
store i32 %132, i32* %133
%134 = getelementptr inbounds i32, i32* %129, i64 -2
%135 = load i32, i32* %134
%136 = getelementptr inbounds i32, i32* %130, i64 -2
store i32 %135, i32* %136
%137 = getelementptr inbounds i32, i32* %129, i64 -3
%138 = load i32, i32* %137
%139 = getelementptr inbounds i32, i32* %130, i64 -3
store i32 %138, i32* %139
%140 = getelementptr inbounds i32, i32* %129, i64 -4
%141 = load i32, i32* %140
%142 = getelementptr inbounds i32, i32* %130, i64 -4
store i32 %141, i32* %142
%143 = getelementptr inbounds i32, i32* %129, i64 -5
%144 = load i32, i32* %143
%145 = getelementptr inbounds i32, i32* %130, i64 -5
store i32 %144, i32* %145
%146 = getelementptr inbounds i32, i32* %129, i64 -6
%147 = load i32, i32* %146
%148 = getelementptr inbounds i32, i32* %130, i64 -6
store i32 %147, i32* %148
%149 = getelementptr inbounds i32, i32* %129, i64 -7
%150 = load i32, i32* %149
%151 = getelementptr inbounds i32, i32* %130, i64 -7
store i32 %150, i32* %151
%152 = add nsw i32 %128, -8
%153 = getelementptr inbounds i32, i32* %129, i64 -8
%154 = load i32, i32* %153
%155 = getelementptr inbounds i32, i32* %130, i64 -8
store i32 %154, i32* %155
%156 = icmp eq i32 %152, 0
br i1 %156, label %157, label %127
157: ; preds = %122, %127, %102, %3
ret void
}