int str_get_characters_by_codes_range(char *buffer,
                                      const unsigned int start_code,
                                      const unsigned int end_code) {
  if (end_code > 128)
    return -1;
  if (start_code < 1 || end_code < start_code)
    return -2;
  int i = 0;
  for (int code = start_code; code < end_code; ++code) {
    buffer[i] = code;
    ++i;
  }
  return 0;
}


x86 assembly (clang, -O0):
<str_get_characters_by_codes_range>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
cmpl   $0x80,-0x18(%rbp)
jbe    1127 <str_get_characters_by_codes_range+0x27>
movl   $0xffffffff,-0x4(%rbp)
jmp    1190 <str_get_characters_by_codes_range+0x90>
cmpl   $0x1,-0x14(%rbp)
jb     113d <str_get_characters_by_codes_range+0x3d>
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jae    1149 <str_get_characters_by_codes_range+0x49>
movl   $0xfffffffe,-0x4(%rbp)
jmp    1190 <str_get_characters_by_codes_range+0x90>
movl   $0x0,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
jae    1189 <str_get_characters_by_codes_range+0x89>
mov    -0x20(%rbp),%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1156 <str_get_characters_by_codes_range+0x56>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<str_get_characters_by_codes_range>:
mov    $0xffffffff,%eax
cmp    $0x80,%edx
ja     12a0 <str_get_characters_by_codes_range+0x1a0>
lea    -0x1(%rsi),%ecx
mov    $0xfffffffe,%eax
cmp    %edx,%ecx
jae    12a0 <str_get_characters_by_codes_range+0x1a0>
xor    %eax,%eax
sub    %esi,%edx
jbe    12a0 <str_get_characters_by_codes_range+0x1a0>
cmp    $0x10,%edx
jae    1138 <str_get_characters_by_codes_range+0x38>
xor    %r8d,%r8d
jmp    127c <str_get_characters_by_codes_range+0x17c>
mov    %edx,%r8d
and    $0xfffffff0,%r8d
movd   %esi,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm2
paddb  0xea7(%rip),%xmm2
lea    -0x10(%r8),%rcx
mov    %rcx,%rax
shr    $0x4,%rax
add    $0x1,%rax
mov    %eax,%r9d
and    $0x7,%r9d
cmp    $0x70,%rcx
jae    117c <str_get_characters_by_codes_range+0x7c>
xor    %ecx,%ecx
jmp    1247 <str_get_characters_by_codes_range+0x147>
and    $0xfffffffffffffff8,%rax
xor    %ecx,%ecx
movdqa 0xe85(%rip),%xmm8
movdqa 0xe8c(%rip),%xmm9
movdqa 0xe94(%rip),%xmm3
movdqa 0xe9c(%rip),%xmm4
movdqa 0xea4(%rip),%xmm5
movdqa 0xeac(%rip),%xmm6
movdqa 0xeb4(%rip),%xmm7
movdqa 0xebc(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu %xmm2,(%rdi,%rcx,1)
movdqa %xmm2,%xmm0
paddb  %xmm8,%xmm0
movdqu %xmm0,0x10(%rdi,%rcx,1)
movdqa %xmm2,%xmm0
paddb  %xmm9,%xmm0
movdqu %xmm0,0x20(%rdi,%rcx,1)
movdqa %xmm2,%xmm0
paddb  %xmm3,%xmm0
movdqu %xmm0,0x30(%rdi,%rcx,1)
movdqa %xmm2,%xmm0
paddb  %xmm4,%xmm0
movdqu %xmm0,0x40(%rdi,%rcx,1)
movdqa %xmm2,%xmm0
paddb  %xmm5,%xmm0
movdqu %xmm0,0x50(%rdi,%rcx,1)
movdqa %xmm2,%xmm0
paddb  %xmm6,%xmm0
movdqu %xmm0,0x60(%rdi,%rcx,1)
movdqa %xmm2,%xmm0
paddb  %xmm7,%xmm0
movdqu %xmm0,0x70(%rdi,%rcx,1)
sub    $0xffffffffffffff80,%rcx
pxor   %xmm1,%xmm2
add    $0xfffffffffffffff8,%rax
jne    11d0 <str_get_characters_by_codes_range+0xd0>
test   %r9,%r9
je     1272 <str_get_characters_by_codes_range+0x172>
add    %rdi,%rcx
shl    $0x4,%r9
xor    %eax,%eax
movdqa 0xdb3(%rip),%xmm1
nopl   (%rax)
movdqu %xmm2,(%rcx,%rax,1)
paddb  %xmm1,%xmm2
add    $0x10,%rax
cmp    %rax,%r9
jne    1260 <str_get_characters_by_codes_range+0x160>
xor    %eax,%eax
cmp    %rdx,%r8
je     12a0 <str_get_characters_by_codes_range+0x1a0>
add    %r8d,%esi
add    %r8,%rdi
sub    %r8,%rdx
mov    %esi,%r8d
xor    %eax,%eax
xor    %esi,%esi
nopl   0x0(%rax)
lea    (%r8,%rsi,1),%ecx
mov    %cl,(%rdi,%rsi,1)
add    $0x1,%rsi
cmp    %rsi,%rdx
jne    1290 <str_get_characters_by_codes_range+0x190>
ret

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

LLVM IR (-O2):
define i32 @str_get_characters_by_codes_range(i8* nocapture writeonly %0, i32 %1, i32 %2) {
%4 = icmp ugt i32 %2, 128
br i1 %4, label %94, label %5
5: ; preds = %3
%6 = add i32 %1, -1
%7 = icmp ult i32 %6, %2
br i1 %7, label %8, label %94
8: ; preds = %5
%9 = icmp ugt i32 %2, %1
br i1 %9, label %10, label %94
10: ; preds = %8
%11 = sub i32 %2, %1
%12 = zext i32 %11 to i64
%13 = icmp ult i32 %11, 16
br i1 %13, label %83, label %14
14: ; preds = %10
%15 = and i64 %12, 4294967280
%16 = trunc i64 %15 to i32
%17 = add i32 %16, %1
%18 = trunc i32 %1 to i8
%19 = insertelement <16 x i8> poison, i8 %18, i64 0
%20 = shufflevector <16 x i8> %19, <16 x i8> poison, <16 x i32> zeroinitializer
%21 = add <16 x i8> %20, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>
%22 = add nsw i64 %15, -16
%23 = lshr exact i64 %22, 4
%24 = add nuw nsw i64 %23, 1
%25 = and i64 %24, 7
%26 = icmp ult i64 %22, 112
br i1 %26, label %67, label %27
27: ; preds = %14
%28 = and i64 %24, 2305843009213693944
br label %29
29: ; preds = %29, %27
%30 = phi i64 [ 0, %27 ], [ %63, %29 ]
%31 = phi <16 x i8> [ %21, %27 ], [ %64, %29 ]
%32 = phi i64 [ 0, %27 ], [ %65, %29 ]
%33 = getelementptr inbounds i8, i8* %0, i64 %30
%34 = bitcast i8* %33 to <16 x i8>*
store <16 x i8> %31, <16 x i8>* %34
%35 = or i64 %30, 16
%36 = add <16 x i8> %31, <i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16>
%37 = getelementptr inbounds i8, i8* %0, i64 %35
%38 = bitcast i8* %37 to <16 x i8>*
store <16 x i8> %36, <16 x i8>* %38
%39 = or i64 %30, 32
%40 = add <16 x i8> %31, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%41 = getelementptr inbounds i8, i8* %0, i64 %39
%42 = bitcast i8* %41 to <16 x i8>*
store <16 x i8> %40, <16 x i8>* %42
%43 = or i64 %30, 48
%44 = add <16 x i8> %31, <i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48, i8 48>
%45 = getelementptr inbounds i8, i8* %0, i64 %43
%46 = bitcast i8* %45 to <16 x i8>*
store <16 x i8> %44, <16 x i8>* %46
%47 = or i64 %30, 64
%48 = add <16 x i8> %31, <i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64>
%49 = getelementptr inbounds i8, i8* %0, i64 %47
%50 = bitcast i8* %49 to <16 x i8>*
store <16 x i8> %48, <16 x i8>* %50
%51 = or i64 %30, 80
%52 = add <16 x i8> %31, <i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80, i8 80>
%53 = getelementptr inbounds i8, i8* %0, i64 %51
%54 = bitcast i8* %53 to <16 x i8>*
store <16 x i8> %52, <16 x i8>* %54
%55 = or i64 %30, 96
%56 = add <16 x i8> %31, <i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96, i8 96>
%57 = getelementptr inbounds i8, i8* %0, i64 %55
%58 = bitcast i8* %57 to <16 x i8>*
store <16 x i8> %56, <16 x i8>* %58
%59 = or i64 %30, 112
%60 = add <16 x i8> %31, <i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112, i8 112>
%61 = getelementptr inbounds i8, i8* %0, i64 %59
%62 = bitcast i8* %61 to <16 x i8>*
store <16 x i8> %60, <16 x i8>* %62
%63 = add nuw i64 %30, 128
%64 = xor <16 x i8> %31, <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>
%65 = add i64 %32, 8
%66 = icmp eq i64 %65, %28
br i1 %66, label %67, label %29
67: ; preds = %29, %14
%68 = phi i64 [ 0, %14 ], [ %63, %29 ]
%69 = phi <16 x i8> [ %21, %14 ], [ %64, %29 ]
%70 = icmp eq i64 %25, 0
br i1 %70, label %81, label %71
71: ; preds = %67, %71
%72 = phi i64 [ %77, %71 ], [ %68, %67 ]
%73 = phi <16 x i8> [ %78, %71 ], [ %69, %67 ]
%74 = phi i64 [ %79, %71 ], [ 0, %67 ]
%75 = getelementptr inbounds i8, i8* %0, i64 %72
%76 = bitcast i8* %75 to <16 x i8>*
store <16 x i8> %73, <16 x i8>* %76
%77 = add nuw i64 %72, 16
%78 = add <16 x i8> %73, <i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16>
%79 = add i64 %74, 1
%80 = icmp eq i64 %79, %25
br i1 %80, label %81, label %71
81: ; preds = %71, %67
%82 = icmp eq i64 %15, %12
br i1 %82, label %94, label %83
83: ; preds = %10, %81
%84 = phi i64 [ 0, %10 ], [ %15, %81 ]
%85 = phi i32 [ %1, %10 ], [ %17, %81 ]
br label %86
86: ; preds = %83, %86
%87 = phi i64 [ %91, %86 ], [ %84, %83 ]
%88 = phi i32 [ %92, %86 ], [ %85, %83 ]
%89 = trunc i32 %88 to i8
%90 = getelementptr inbounds i8, i8* %0, i64 %87
store i8 %89, i8* %90
%91 = add nuw nsw i64 %87, 1
%92 = add nuw nsw i32 %88, 1
%93 = icmp eq i64 %91, %12
br i1 %93, label %94, label %86
94: ; preds = %86, %81, %8, %5, %3
%95 = phi i32 [ -1, %3 ], [ -2, %5 ], [ 0, %8 ], [ 0, %81 ], [ 0, %86 ]
ret i32 %95
}