void insertQuotes(int begin, int end, char *str, int n) {
  int k;
  for (k = n + 2; k > end; k--) {
    str[k] = str[k - 2];
  }
  for (k = end + 1; k > begin; k--) {
    str[k] = str[k - 1];
  }
  str[begin] = '"';
  str[end] = '"';
}


x86 assembly (clang, -O0):
<insertQuotes>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    114f <insertQuotes+0x4f>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    111a <insertQuotes+0x1a>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x4(%rbp),%eax
jle    118d <insertQuotes+0x8d>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    1158 <insertQuotes+0x58>
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movb   $0x22,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x8(%rbp),%rcx
movb   $0x22,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<insertQuotes>:
push   %rbp
push   %r14
push   %rbx
add    $0x2,%ecx
movslq %esi,%r9
cmp    %esi,%ecx
jle    1231 <insertQuotes+0x131>
movslq %ecx,%rcx
mov    %rcx,%r8
sub    %r9,%r8
cmp    $0x4,%r8
jb     1220 <insertQuotes+0x120>
cmp    $0x10,%r8
jae    1133 <insertQuotes+0x33>
xor    %r11d,%r11d
jmp    11e2 <insertQuotes+0xe2>
mov    %r8,%r11
and    $0xfffffffffffffff0,%r11
lea    -0x10(%r11),%rax
mov    %rax,%r14
shr    $0x4,%r14
add    $0x1,%r14
mov    %r14d,%r10d
and    $0x3,%r10d
cmp    $0x30,%rax
jae    1162 <insertQuotes+0x62>
xor    %eax,%eax
test   %r10,%r10
jne    11a9 <insertQuotes+0xa9>
jmp    11d7 <insertQuotes+0xd7>
and    $0xfffffffffffffffc,%r14
lea    (%rcx,%rdx,1),%rbx
add    $0xfffffffffffffff1,%rbx
xor    %eax,%eax
movups -0x32(%rbx,%rax,1),%xmm0
movups -0x22(%rbx,%rax,1),%xmm1
movups -0x12(%rbx,%rax,1),%xmm2
movups -0x2(%rbx,%rax,1),%xmm3
movups %xmm3,(%rbx,%rax,1)
movups %xmm2,-0x10(%rbx,%rax,1)
movups %xmm1,-0x20(%rbx,%rax,1)
movups %xmm0,-0x30(%rbx,%rax,1)
add    $0xffffffffffffffc0,%rax
add    $0xfffffffffffffffc,%r14
jne    1170 <insertQuotes+0x70>
neg    %rax
test   %r10,%r10
je     11d7 <insertQuotes+0xd7>
mov    %rcx,%rbx
sub    %rax,%rbx
lea    (%rbx,%rdx,1),%r14
add    $0xfffffffffffffff1,%r14
shl    $0x4,%r10
xor    %ebx,%ebx
nopl   (%rax)
movups -0x2(%r14,%rbx,1),%xmm0
movups %xmm0,(%r14,%rbx,1)
add    $0xfffffffffffffff0,%rbx
mov    %r10,%rax
add    %rbx,%rax
jne    11c0 <insertQuotes+0xc0>
cmp    %r11,%r8
je     1231 <insertQuotes+0x131>
test   $0xc,%r8b
je     1219 <insertQuotes+0x119>
mov    %r8,%r10
and    $0xfffffffffffffffc,%r10
mov    %r10,%rax
neg    %rax
neg    %r11
lea    (%rcx,%rdx,1),%rbx
add    $0xfffffffffffffffd,%rbx
sub    %r10,%rcx
nopl   (%rax)
mov    -0x2(%rbx,%r11,1),%ebp
mov    %ebp,(%rbx,%r11,1)
add    $0xfffffffffffffffc,%r11
cmp    %r11,%rax
jne    1200 <insertQuotes+0x100>
cmp    %r10,%r8
jne    1220 <insertQuotes+0x120>
jmp    1231 <insertQuotes+0x131>
sub    %r11,%rcx
nopl   0x0(%rax)
movzbl -0x2(%rdx,%rcx,1),%eax
mov    %al,(%rdx,%rcx,1)
add    $0xffffffffffffffff,%rcx
cmp    %r9,%rcx
jg     1220 <insertQuotes+0x120>
cmp    %edi,%esi
jge    123a <insertQuotes+0x13a>
movslq %edi,%rax
jmp    1264 <insertQuotes+0x164>
add    $0x1,%esi
movslq %esi,%rcx
movslq %edi,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl -0x1(%rdx,%rcx,1),%ebx
mov    %bl,(%rdx,%rcx,1)
lea    -0x1(%rcx),%rsi
mov    %rsi,%rcx
cmp    %rax,%rsi
jg     1250 <insertQuotes+0x150>
movb   $0x22,(%rdx,%rax,1)
movb   $0x22,(%rdx,%r9,1)
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define void @insertQuotes(i32 %0, i32 %1, i8* %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store i8* %2, i8** %7
store i32 %3, i32* %8
%10 = load i32, i32* %8
%11 = add nsw i32 %10, 2
store i32 %11, i32* %9
br label %12
12: ; preds = %27, %4
%13 = load i32, i32* %9
%14 = load i32, i32* %6
%15 = icmp sgt i32 %13, %14
br i1 %15, label %16, label %30
16: ; preds = %12
%17 = load i8*, i8** %7
%18 = load i32, i32* %9
%19 = sub nsw i32 %18, 2
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i8, i8* %17, i64 %20
%22 = load i8, i8* %21
%23 = load i8*, i8** %7
%24 = load i32, i32* %9
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %23, i64 %25
store i8 %22, i8* %26
br label %27
27: ; preds = %16
%28 = load i32, i32* %9
%29 = add nsw i32 %28, -1
store i32 %29, i32* %9
br label %12
30: ; preds = %12
%31 = load i32, i32* %6
%32 = add nsw i32 %31, 1
store i32 %32, i32* %9
br label %33
33: ; preds = %48, %30
%34 = load i32, i32* %9
%35 = load i32, i32* %5
%36 = icmp sgt i32 %34, %35
br i1 %36, label %37, label %51
37: ; preds = %33
%38 = load i8*, i8** %7
%39 = load i32, i32* %9
%40 = sub nsw i32 %39, 1
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %38, i64 %41
%43 = load i8, i8* %42
%44 = load i8*, i8** %7
%45 = load i32, i32* %9
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i8, i8* %44, i64 %46
store i8 %43, i8* %47
br label %48
48: ; preds = %37
%49 = load i32, i32* %9
%50 = add nsw i32 %49, -1
store i32 %50, i32* %9
br label %33
51: ; preds = %33
%52 = load i8*, i8** %7
%53 = load i32, i32* %5
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i8, i8* %52, i64 %54
store i8 34, i8* %55
%56 = load i8*, i8** %7
%57 = load i32, i32* %6
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8, i8* %56, i64 %58
store i8 34, i8* %59
ret void
}

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