int add_uppercase(char *tab, int i) {
  tab[i++] = 'A';
  tab[i++] = 'B';
  tab[i++] = 'C';
  tab[i++] = 'D';
  tab[i++] = 'E';
  tab[i++] = 'F';
  tab[i++] = 'G';
  tab[i++] = 'H';
  tab[i++] = 'I';
  tab[i++] = 'J';
  tab[i++] = 'K';
  tab[i++] = 'L';
  tab[i++] = 'M';
  tab[i++] = 'N';
  tab[i++] = 'O';
  tab[i++] = 'P';
  tab[i++] = 'Q';
  tab[i++] = 'R';
  tab[i++] = 'S';
  tab[i++] = 'T';
  tab[i++] = 'U';
  tab[i++] = 'V';
  tab[i++] = 'W';
  tab[i++] = 'X';
  tab[i++] = 'Y';
  tab[i++] = 'Z';
  return i;
}


x86 assembly (clang, -O0):
<add_uppercase>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x41,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x42,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x43,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x44,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x45,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x46,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x47,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x48,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x49,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x4a,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x4b,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x4c,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x4d,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x4e,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x4f,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x50,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x51,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x52,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x53,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x54,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x55,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x56,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x57,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x58,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x59,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0xc(%rbp)
movslq %ecx,%rcx
movb   $0x5a,(%rax,%rcx,1)
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<add_uppercase>:
movslq %esi,%rax
movaps 0xef6(%rip),%xmm0
movups %xmm0,(%rdi,%rax,1)
movabs $0x5857565554535251,%rcx
56 57 58
mov    %rcx,0x10(%rdi,%rax,1)
movw   $0x5a59,0x18(%rdi,%rax,1)
add    $0x1a,%eax
ret

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

LLVM IR (-O2):
define i32 @add_uppercase(i8* writeonly %0, i32 %1) {
%3 = add nsw i32 %1, 1
%4 = sext i32 %1 to i64
%5 = getelementptr inbounds i8, i8* %0, i64 %4
store i8 65, i8* %5
%6 = add nsw i32 %1, 2
%7 = sext i32 %3 to i64
%8 = getelementptr inbounds i8, i8* %0, i64 %7
store i8 66, i8* %8
%9 = add nsw i32 %1, 3
%10 = sext i32 %6 to i64
%11 = getelementptr inbounds i8, i8* %0, i64 %10
store i8 67, i8* %11
%12 = add nsw i32 %1, 4
%13 = sext i32 %9 to i64
%14 = getelementptr inbounds i8, i8* %0, i64 %13
store i8 68, i8* %14
%15 = add nsw i32 %1, 5
%16 = sext i32 %12 to i64
%17 = getelementptr inbounds i8, i8* %0, i64 %16
store i8 69, i8* %17
%18 = add nsw i32 %1, 6
%19 = sext i32 %15 to i64
%20 = getelementptr inbounds i8, i8* %0, i64 %19
store i8 70, i8* %20
%21 = add nsw i32 %1, 7
%22 = sext i32 %18 to i64
%23 = getelementptr inbounds i8, i8* %0, i64 %22
store i8 71, i8* %23
%24 = add nsw i32 %1, 8
%25 = sext i32 %21 to i64
%26 = getelementptr inbounds i8, i8* %0, i64 %25
store i8 72, i8* %26
%27 = add nsw i32 %1, 9
%28 = sext i32 %24 to i64
%29 = getelementptr inbounds i8, i8* %0, i64 %28
store i8 73, i8* %29
%30 = add nsw i32 %1, 10
%31 = sext i32 %27 to i64
%32 = getelementptr inbounds i8, i8* %0, i64 %31
store i8 74, i8* %32
%33 = add nsw i32 %1, 11
%34 = sext i32 %30 to i64
%35 = getelementptr inbounds i8, i8* %0, i64 %34
store i8 75, i8* %35
%36 = add nsw i32 %1, 12
%37 = sext i32 %33 to i64
%38 = getelementptr inbounds i8, i8* %0, i64 %37
store i8 76, i8* %38
%39 = add nsw i32 %1, 13
%40 = sext i32 %36 to i64
%41 = getelementptr inbounds i8, i8* %0, i64 %40
store i8 77, i8* %41
%42 = add nsw i32 %1, 14
%43 = sext i32 %39 to i64
%44 = getelementptr inbounds i8, i8* %0, i64 %43
store i8 78, i8* %44
%45 = add nsw i32 %1, 15
%46 = sext i32 %42 to i64
%47 = getelementptr inbounds i8, i8* %0, i64 %46
store i8 79, i8* %47
%48 = add nsw i32 %1, 16
%49 = sext i32 %45 to i64
%50 = getelementptr inbounds i8, i8* %0, i64 %49
store i8 80, i8* %50
%51 = add nsw i32 %1, 17
%52 = sext i32 %48 to i64
%53 = getelementptr inbounds i8, i8* %0, i64 %52
store i8 81, i8* %53
%54 = add nsw i32 %1, 18
%55 = sext i32 %51 to i64
%56 = getelementptr inbounds i8, i8* %0, i64 %55
store i8 82, i8* %56
%57 = add nsw i32 %1, 19
%58 = sext i32 %54 to i64
%59 = getelementptr inbounds i8, i8* %0, i64 %58
store i8 83, i8* %59
%60 = add nsw i32 %1, 20
%61 = sext i32 %57 to i64
%62 = getelementptr inbounds i8, i8* %0, i64 %61
store i8 84, i8* %62
%63 = add nsw i32 %1, 21
%64 = sext i32 %60 to i64
%65 = getelementptr inbounds i8, i8* %0, i64 %64
store i8 85, i8* %65
%66 = add nsw i32 %1, 22
%67 = sext i32 %63 to i64
%68 = getelementptr inbounds i8, i8* %0, i64 %67
store i8 86, i8* %68
%69 = add nsw i32 %1, 23
%70 = sext i32 %66 to i64
%71 = getelementptr inbounds i8, i8* %0, i64 %70
store i8 87, i8* %71
%72 = add nsw i32 %1, 24
%73 = sext i32 %69 to i64
%74 = getelementptr inbounds i8, i8* %0, i64 %73
store i8 88, i8* %74
%75 = add nsw i32 %1, 25
%76 = sext i32 %72 to i64
%77 = getelementptr inbounds i8, i8* %0, i64 %76
store i8 89, i8* %77
%78 = add nsw i32 %1, 26
%79 = sext i32 %75 to i64
%80 = getelementptr inbounds i8, i8* %0, i64 %79
store i8 90, i8* %80
ret i32 %78
}