int add_special_char(char *tab, int i) {
  tab[i++] = '~';
  tab[i++] = '!';
  tab[i++] = '@';
  tab[i++] = '#';
  tab[i++] = '$';
  tab[i++] = '%';
  tab[i++] = '^';
  tab[i++] = '&';
  tab[i++] = '*';
  tab[i++] = '(';
  tab[i++] = ')';
  tab[i++] = '-';
  tab[i++] = '=';
  tab[i++] = '+';
  tab[i++] = '[';
  tab[i++] = ']';
  tab[i++] = '{';
  tab[i++] = '}';
  tab[i++] = ';';
  tab[i++] = ':';
  tab[i++] = ',';
  tab[i++] = '.';
  tab[i++] = '<';
  tab[i++] = '>';
  tab[i++] = '/';
  tab[i++] = '?';
  return i;
}


x86 assembly (clang, -O0):
<add_special_char>:
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   $0x7e,(%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   $0x21,(%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   $0x40,(%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   $0x23,(%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   $0x24,(%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   $0x25,(%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   $0x5e,(%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   $0x26,(%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   $0x2a,(%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   $0x28,(%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   $0x29,(%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   $0x2d,(%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   $0x3d,(%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   $0x2b,(%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   $0x5b,(%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   $0x5d,(%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   $0x7b,(%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   $0x7d,(%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   $0x3b,(%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   $0x3a,(%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   $0x2c,(%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   $0x2e,(%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   $0x3c,(%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   $0x3e,(%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   $0x2f,(%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   $0x3f,(%rax,%rcx,1)
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<add_special_char>:
movslq %esi,%rax
movaps 0xef6(%rip),%xmm0
movups %xmm0,(%rdi,%rax,1)
movabs $0x3e3c2e2c3a3b7d7b,%rcx
2e 3c 3e
mov    %rcx,0x10(%rdi,%rax,1)
movw   $0x3f2f,0x18(%rdi,%rax,1)
add    $0x1a,%eax
ret

LLVM IR (-O0):
define i32 @add_special_char(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 126, 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 33, 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 64, 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 35, 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 36, 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 37, 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 94, 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 38, 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 42, 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 40, 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 41, 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 45, 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 61, 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 43, 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 91, 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 93, 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 123, 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 125, 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 59, 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 58, 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 44, 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 46, 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 60, 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 62, 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 47, 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 63, i8* %134
%135 = load i32, i32* %4
ret i32 %135
}

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