void insert(char a[], int len, int n, int v) {
  int i = n, temp = v, swap;
  while (i <= len) {
    swap = a[i];
    a[i] = temp;
    temp = swap;
    i++;
  }
}


x86 assembly (clang, -O0):
<insert>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     115c <insert+0x5c>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    111d <insert+0x1d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<insert>:
mov    %esi,%r8d
sub    %edx,%r8d
jl     11f1 <insert+0xf1>
movslq %edx,%rdx
cmp    $0xf,%r8d
jae    111d <insert+0x1d>
mov    %rdx,%rax
jmp    11d1 <insert+0xd1>
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffff0,%r9
lea    (%r9,%rdx,1),%rax
movd   %ecx,%xmm0
pshufd $0x0,%xmm0,%xmm0
add    %rdi,%rdx
xor    %ecx,%ecx
pxor   %xmm1,%xmm1
movaps 0xebb(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nop
movdqa %xmm0,%xmm3
movdqu (%rdx,%rcx,1),%xmm4
movdqa %xmm4,%xmm5
punpckhbw %xmm1,%xmm5
movdqa %xmm5,%xmm0
punpckhwd %xmm1,%xmm0
punpcklwd %xmm1,%xmm5
punpcklbw %xmm1,%xmm4
movdqa %xmm4,%xmm6
punpckhwd %xmm1,%xmm6
punpcklwd %xmm1,%xmm4
shufps $0x3,%xmm4,%xmm3
shufps $0x98,%xmm4,%xmm3
shufps $0x3,%xmm6,%xmm4
shufps $0x98,%xmm6,%xmm4
shufps $0x3,%xmm5,%xmm6
shufps $0x98,%xmm5,%xmm6
shufps $0x3,%xmm0,%xmm5
shufps $0x98,%xmm0,%xmm5
andps  %xmm2,%xmm5
andps  %xmm2,%xmm6
packuswb %xmm5,%xmm6
andps  %xmm2,%xmm4
andps  %xmm2,%xmm3
packuswb %xmm4,%xmm3
packuswb %xmm6,%xmm3
movdqu %xmm3,(%rdx,%rcx,1)
add    $0x10,%rcx
cmp    %rcx,%r9
jne    1150 <insert+0x50>
cmp    %r9,%r8
je     11f1 <insert+0xf1>
pshufd $0xff,%xmm0,%xmm0
movd   %xmm0,%ecx
add    $0x1,%esi
mov    %esi,%edx
cs nopw 0x0(%rax,%rax,1)
movzbl (%rdi,%rax,1),%esi
mov    %cl,(%rdi,%rax,1)
add    $0x1,%rax
mov    %esi,%ecx
cmp    %eax,%edx
jne    11e0 <insert+0xe0>
ret

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

LLVM IR (-O2):
define void @insert(i8* nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp slt i32 %1, %2
br i1 %5, label %46, label %6
6: ; preds = %4
%7 = sext i32 %2 to i64
%8 = add i32 %1, 1
%9 = sub i32 %1, %2
%10 = zext i32 %9 to i64
%11 = add nuw nsw i64 %10, 1
%12 = icmp ult i32 %9, 15
br i1 %12, label %33, label %13
13: ; preds = %6
%14 = and i64 %11, 8589934576
%15 = add nsw i64 %14, %7
%16 = insertelement <16 x i32> poison, i32 %3, i64 15
br label %17
17: ; preds = %17, %13
%18 = phi i64 [ 0, %13 ], [ %28, %17 ]
%19 = phi <16 x i32> [ %16, %13 ], [ %24, %17 ]
%20 = add i64 %18, %7
%21 = getelementptr inbounds i8, i8* %0, i64 %20
%22 = bitcast i8* %21 to <16 x i8>*
%23 = load <16 x i8>, <16 x i8>* %22
%24 = zext <16 x i8> %23 to <16 x i32>
%25 = shufflevector <16 x i32> %19, <16 x i32> %24, <16 x i32> <i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30>
%26 = trunc <16 x i32> %25 to <16 x i8>
%27 = bitcast i8* %21 to <16 x i8>*
store <16 x i8> %26, <16 x i8>* %27
%28 = add nuw i64 %18, 16
%29 = icmp eq i64 %28, %14
br i1 %29, label %30, label %17
30: ; preds = %17
%31 = icmp eq i64 %11, %14
%32 = extractelement <16 x i32> %24, i64 15
br i1 %31, label %46, label %33
33: ; preds = %6, %30
%34 = phi i64 [ %15, %30 ], [ %7, %6 ]
%35 = phi i32 [ %32, %30 ], [ %3, %6 ]
br label %36
36: ; preds = %33, %36
%37 = phi i64 [ %43, %36 ], [ %34, %33 ]
%38 = phi i32 [ %41, %36 ], [ %35, %33 ]
%39 = getelementptr inbounds i8, i8* %0, i64 %37
%40 = load i8, i8* %39
%41 = zext i8 %40 to i32
%42 = trunc i32 %38 to i8
store i8 %42, i8* %39
%43 = add nsw i64 %37, 1
%44 = trunc i64 %43 to i32
%45 = icmp eq i32 %8, %44
br i1 %45, label %46, label %36
46: ; preds = %36, %30, %4
ret void
}