void moveArray(char *string, int i, int lengthString) {
  for (int j = lengthString; j > i; j--) {
    string[j + 2] = string[j];
  }
}


x86 assembly (clang, -O0):
<moveArray>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jle    1149 <moveArray+0x49>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1114 <moveArray+0x14>
pop    %rbp
ret

x86 assembly (clang, -O2):
<moveArray>:
cmp    %esi,%edx
jle    1231 <moveArray+0x131>
movslq %edx,%rax
movslq %esi,%r10
mov    %rax,%r8
sub    %r10,%r8
cmp    $0x4,%r8
jb     1220 <moveArray+0x120>
cmp    $0x10,%r8
jae    112b <moveArray+0x2b>
xor    %esi,%esi
jmp    11e2 <moveArray+0xe2>
mov    %r8,%rsi
and    $0xfffffffffffffff0,%rsi
lea    -0x10(%rsi),%rcx
mov    %rcx,%r11
shr    $0x4,%r11
add    $0x1,%r11
mov    %r11d,%r9d
and    $0x3,%r9d
cmp    $0x30,%rcx
jae    115a <moveArray+0x5a>
xor    %edx,%edx
test   %r9,%r9
jne    11a9 <moveArray+0xa9>
jmp    11d7 <moveArray+0xd7>
and    $0xfffffffffffffffc,%r11
lea    (%rax,%rdi,1),%rcx
add    $0xfffffffffffffff3,%rcx
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movups -0x32(%rcx,%rdx,1),%xmm0
movups -0x22(%rcx,%rdx,1),%xmm1
movups -0x12(%rcx,%rdx,1),%xmm2
movups -0x2(%rcx,%rdx,1),%xmm3
movups %xmm3,(%rcx,%rdx,1)
movups %xmm2,-0x10(%rcx,%rdx,1)
movups %xmm1,-0x20(%rcx,%rdx,1)
movups %xmm0,-0x30(%rcx,%rdx,1)
add    $0xffffffffffffffc0,%rdx
add    $0xfffffffffffffffc,%r11
jne    1170 <moveArray+0x70>
neg    %rdx
test   %r9,%r9
je     11d7 <moveArray+0xd7>
mov    %rax,%rcx
sub    %rdx,%rcx
lea    (%rcx,%rdi,1),%r11
add    $0xfffffffffffffff3,%r11
shl    $0x4,%r9
xor    %edx,%edx
nopl   (%rax)
movups -0x2(%r11,%rdx,1),%xmm0
movups %xmm0,(%r11,%rdx,1)
add    $0xfffffffffffffff0,%rdx
mov    %r9,%rcx
add    %rdx,%rcx
jne    11c0 <moveArray+0xc0>
cmp    %rsi,%r8
je     1231 <moveArray+0x131>
test   $0xc,%r8b
je     1217 <moveArray+0x117>
mov    %r8,%r9
and    $0xfffffffffffffffc,%r9
mov    %r9,%r11
neg    %r11
neg    %rsi
lea    (%rax,%rdi,1),%rcx
add    $0xffffffffffffffff,%rcx
sub    %r9,%rax
nopl   (%rax)
mov    -0x2(%rcx,%rsi,1),%edx
mov    %edx,(%rcx,%rsi,1)
add    $0xfffffffffffffffc,%rsi
cmp    %rsi,%r11
jne    1200 <moveArray+0x100>
cmp    %r9,%r8
jne    1220 <moveArray+0x120>
jmp    1231 <moveArray+0x131>
sub    %rsi,%rax
nopw   0x0(%rax,%rax,1)
movzbl (%rdi,%rax,1),%ecx
mov    %cl,0x2(%rdi,%rax,1)
add    $0xffffffffffffffff,%rax
cmp    %r10,%rax
jg     1220 <moveArray+0x120>
ret

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

LLVM IR (-O2):
define void @moveArray(i8* nocapture %0, i32 %1, i32 %2) {
%4 = icmp sgt i32 %2, %1
br i1 %4, label %5, label %113
5: ; preds = %3
%6 = sext i32 %2 to i64
%7 = sext i32 %1 to i64
%8 = sub nsw i64 %6, %7
%9 = icmp ult i64 %8, 4
br i1 %9, label %111, label %10
10: ; preds = %5
%11 = icmp ult i64 %8, 16
br i1 %11, label %91, label %12
12: ; preds = %10
%13 = and i64 %8, -16
%14 = add nsw i64 %13, -16
%15 = lshr exact i64 %14, 4
%16 = add nuw nsw i64 %15, 1
%17 = and i64 %16, 3
%18 = icmp ult i64 %14, 48
br i1 %18, label %66, label %19
19: ; preds = %12
%20 = and i64 %16, 2305843009213693948
%21 = getelementptr inbounds i8, i8* %0, i64 -15
%22 = getelementptr inbounds i8, i8* %0, i64 -15
%23 = getelementptr inbounds i8, i8* %0, i64 -15
%24 = getelementptr inbounds i8, i8* %0, i64 -15
%25 = getelementptr inbounds i8, i8* %0, i64 -15
%26 = getelementptr inbounds i8, i8* %0, i64 -15
%27 = getelementptr inbounds i8, i8* %0, i64 -15
%28 = getelementptr inbounds i8, i8* %0, i64 -15
br label %29
29: ; preds = %29, %19
%30 = phi i64 [ 0, %19 ], [ %63, %29 ]
%31 = phi i64 [ 0, %19 ], [ %64, %29 ]
%32 = sub i64 %6, %30
%33 = getelementptr inbounds i8, i8* %21, i64 %32
%34 = bitcast i8* %33 to <16 x i8>*
%35 = load <16 x i8>, <16 x i8>* %34
%36 = add nsw i64 %32, 2
%37 = getelementptr inbounds i8, i8* %22, i64 %36
%38 = bitcast i8* %37 to <16 x i8>*
store <16 x i8> %35, <16 x i8>* %38
%39 = or i64 %30, 16
%40 = sub i64 %6, %39
%41 = getelementptr inbounds i8, i8* %23, i64 %40
%42 = bitcast i8* %41 to <16 x i8>*
%43 = load <16 x i8>, <16 x i8>* %42
%44 = add nsw i64 %40, 2
%45 = getelementptr inbounds i8, i8* %24, i64 %44
%46 = bitcast i8* %45 to <16 x i8>*
store <16 x i8> %43, <16 x i8>* %46
%47 = or i64 %30, 32
%48 = sub i64 %6, %47
%49 = getelementptr inbounds i8, i8* %25, i64 %48
%50 = bitcast i8* %49 to <16 x i8>*
%51 = load <16 x i8>, <16 x i8>* %50
%52 = add nsw i64 %48, 2
%53 = getelementptr inbounds i8, i8* %26, i64 %52
%54 = bitcast i8* %53 to <16 x i8>*
store <16 x i8> %51, <16 x i8>* %54
%55 = or i64 %30, 48
%56 = sub i64 %6, %55
%57 = getelementptr inbounds i8, i8* %27, i64 %56
%58 = bitcast i8* %57 to <16 x i8>*
%59 = load <16 x i8>, <16 x i8>* %58
%60 = add nsw i64 %56, 2
%61 = getelementptr inbounds i8, i8* %28, i64 %60
%62 = bitcast i8* %61 to <16 x i8>*
store <16 x i8> %59, <16 x i8>* %62
%63 = add nuw i64 %30, 64
%64 = add i64 %31, 4
%65 = icmp eq i64 %64, %20
br i1 %65, label %66, label %29
66: ; preds = %29, %12
%67 = phi i64 [ 0, %12 ], [ %63, %29 ]
%68 = icmp eq i64 %17, 0
br i1 %68, label %85, label %69
69: ; preds = %66
%70 = getelementptr inbounds i8, i8* %0, i64 -15
%71 = getelementptr inbounds i8, i8* %0, i64 -15
br label %72
72: ; preds = %72, %69
%73 = phi i64 [ %67, %69 ], [ %82, %72 ]
%74 = phi i64 [ 0, %69 ], [ %83, %72 ]
%75 = sub i64 %6, %73
%76 = getelementptr inbounds i8, i8* %70, i64 %75
%77 = bitcast i8* %76 to <16 x i8>*
%78 = load <16 x i8>, <16 x i8>* %77
%79 = add nsw i64 %75, 2
%80 = getelementptr inbounds i8, i8* %71, i64 %79
%81 = bitcast i8* %80 to <16 x i8>*
store <16 x i8> %78, <16 x i8>* %81
%82 = add nuw i64 %73, 16
%83 = add i64 %74, 1
%84 = icmp eq i64 %83, %17
br i1 %84, label %85, label %72
85: ; preds = %72, %66
%86 = icmp eq i64 %8, %13
br i1 %86, label %113, label %87
87: ; preds = %85
%88 = sub nsw i64 %6, %13
%89 = and i64 %8, 12
%90 = icmp eq i64 %89, 0
br i1 %90, label %111, label %91
91: ; preds = %10, %87
%92 = phi i64 [ %13, %87 ], [ 0, %10 ]
%93 = sub nsw i64 %6, %7
%94 = and i64 %93, -4
%95 = sub nsw i64 %6, %94
%96 = getelementptr inbounds i8, i8* %0, i64 -3
%97 = getelementptr inbounds i8, i8* %0, i64 -3
br label %98
98: ; preds = %98, %91
%99 = phi i64 [ %92, %91 ], [ %107, %98 ]
%100 = sub i64 %6, %99
%101 = getelementptr inbounds i8, i8* %96, i64 %100
%102 = bitcast i8* %101 to <4 x i8>*
%103 = load <4 x i8>, <4 x i8>* %102
%104 = add nsw i64 %100, 2
%105 = getelementptr inbounds i8, i8* %97, i64 %104
%106 = bitcast i8* %105 to <4 x i8>*
store <4 x i8> %103, <4 x i8>* %106
%107 = add nuw i64 %99, 4
%108 = icmp eq i64 %107, %94
br i1 %108, label %109, label %98
109: ; preds = %98
%110 = icmp eq i64 %93, %94
br i1 %110, label %113, label %111
111: ; preds = %5, %87, %109
%112 = phi i64 [ %6, %5 ], [ %88, %87 ], [ %95, %109 ]
br label %114
113: ; preds = %114, %85, %109, %3
ret void
114: ; preds = %111, %114
%115 = phi i64 [ %120, %114 ], [ %112, %111 ]
%116 = getelementptr inbounds i8, i8* %0, i64 %115
%117 = load i8, i8* %116
%118 = add nsw i64 %115, 2
%119 = getelementptr inbounds i8, i8* %0, i64 %118
store i8 %117, i8* %119
%120 = add nsw i64 %115, -1
%121 = icmp sgt i64 %120, %7
br i1 %121, label %114, label %113
}