int read2ints(char *buffer, int blen, int *ints) {
  int i, okay;
  okay = 1;
  for (i = 0; i < blen; i++) {
    switch (buffer[i]) {
    case 'A':
      ints[i] = 0;
      break;
    case 'C':
      ints[i] = 1;
      break;
    case 'G':
      ints[i] = 2;
      break;
    case 'T':
      ints[i] = 3;
      break;
    default:
      okay = 0;
    }
  }
  return okay;
}


x86 assembly (clang, -O0):
<read2ints>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x1,-0x20(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11c5 <read2ints+0xc5>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xffffffbf,%eax
mov    %eax,%ecx
mov    %rcx,-0x28(%rbp)
sub    $0x13,%eax
ja     11ab <read2ints+0xab>
mov    -0x28(%rbp),%rax
lea    0xeae(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
jmp    11b2 <read2ints+0xb2>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movl   $0x1,(%rax,%rcx,4)
jmp    11b2 <read2ints+0xb2>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movl   $0x2,(%rax,%rcx,4)
jmp    11b2 <read2ints+0xb2>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movl   $0x3,(%rax,%rcx,4)
jmp    11b2 <read2ints+0xb2>
movl   $0x0,-0x20(%rbp)
jmp    11b7 <read2ints+0xb7>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    111d <read2ints+0x1d>
mov    -0x20(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<read2ints>:
push   %r14
push   %rbx
test   %esi,%esi
jle    1150 <read2ints+0x50>
mov    %esi,%r8d
cmp    $0x1,%esi
jne    115a <read2ints+0x5a>
mov    $0x1,%r11d
xor    %ecx,%ecx
mov    %r11d,%eax
test   $0x1,%r8b
je     121d <read2ints+0x11d>
movsbl (%rdi,%rcx,1),%esi
xor    %eax,%eax
add    $0xffffffbf,%esi
cmp    $0x13,%esi
ja     121d <read2ints+0x11d>
lea    0xf63(%rip),%rdi
movslq (%rdi,%rsi,4),%rsi
add    %rdi,%rsi
jmp    *%rsi
mov    $0x1,%eax
jmp    1217 <read2ints+0x117>
mov    $0x1,%eax
jmp    121d <read2ints+0x11d>
mov    %r8d,%r14d
and    $0xfffffffe,%r14d
mov    $0x1,%r11d
xor    %ecx,%ecx
lea    0xee0(%rip),%r9
lea    0xe89(%rip),%r10
jmp    1197 <read2ints+0x97>
nopl   0x0(%rax)
mov    $0x1,%r11d
mov    %r11d,0x4(%rdx,%rcx,4)
mov    %esi,%r11d
add    $0x2,%rcx
cmp    %rcx,%r14
je     1117 <read2ints+0x17>
movsbl (%rdi,%rcx,1),%ebx
add    $0xffffffbf,%ebx
mov    $0x0,%esi
cmp    $0x13,%ebx
ja     11db <read2ints+0xdb>
movslq (%r10,%rbx,4),%rax
add    %r10,%rax
xor    %ebx,%ebx
xor    %esi,%esi
jmp    *%rax
mov    $0x1,%ebx
jmp    11d5 <read2ints+0xd5>
nopl   0x0(%rax)
mov    $0x2,%ebx
jmp    11d5 <read2ints+0xd5>
nopw   0x0(%rax,%rax,1)
mov    $0x3,%ebx
mov    %ebx,(%rdx,%rcx,4)
mov    %r11d,%esi
movsbl 0x1(%rdi,%rcx,1),%ebx
xor    %r11d,%r11d
add    $0xffffffbf,%ebx
cmp    $0x13,%ebx
ja     118e <read2ints+0x8e>
movslq (%r9,%rbx,4),%rax
add    %r9,%rax
jmp    *%rax
mov    $0x2,%r11d
jmp    1186 <read2ints+0x86>
nopl   0x0(%rax)
mov    $0x3,%r11d
jmp    1186 <read2ints+0x86>
mov    $0x2,%eax
jmp    1217 <read2ints+0x117>
mov    $0x3,%eax
mov    %eax,(%rdx,%rcx,4)
mov    %r11d,%eax
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define i32 @read2ints(i8* nocapture %0, i32 %1, i32* nocapture writeonly %2) {
%4 = icmp sgt i32 %1, 0
br i1 %4, label %5, label %56
5: ; preds = %3
%6 = zext i32 %1 to i64
%7 = and i64 %6, 1
%8 = icmp eq i32 %1, 1
br i1 %8, label %41, label %9
9: ; preds = %5
%10 = and i64 %6, 4294967294
br label %11
11: ; preds = %36, %9
%12 = phi i64 [ 0, %9 ], [ %38, %36 ]
%13 = phi i32 [ 1, %9 ], [ %37, %36 ]
%14 = phi i64 [ 0, %9 ], [ %39, %36 ]
%15 = getelementptr inbounds i8, i8* %0, i64 %12
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
switch i32 %17, label %24 [
i32 65, label %21
i32 67, label %18
i32 71, label %19
i32 84, label %20
]
18: ; preds = %11
br label %21
19: ; preds = %11
br label %21
20: ; preds = %11
br label %21
21: ; preds = %11, %20, %19, %18
%22 = phi i32 [ 1, %18 ], [ 2, %19 ], [ 3, %20 ], [ 0, %11 ]
%23 = getelementptr inbounds i32, i32* %2, i64 %12
store i32 %22, i32* %23
br label %24
24: ; preds = %21, %11
%25 = phi i32 [ 0, %11 ], [ %13, %21 ]
%26 = or i64 %12, 1
%27 = getelementptr inbounds i8, i8* %0, i64 %26
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
switch i32 %29, label %36 [
i32 65, label %33
i32 67, label %32
i32 71, label %31
i32 84, label %30
]
30: ; preds = %24
br label %33
31: ; preds = %24
br label %33
32: ; preds = %24
br label %33
33: ; preds = %32, %31, %30, %24
%34 = phi i32 [ 1, %32 ], [ 2, %31 ], [ 3, %30 ], [ 0, %24 ]
%35 = getelementptr inbounds i32, i32* %2, i64 %26
store i32 %34, i32* %35
br label %36
36: ; preds = %33, %24
%37 = phi i32 [ 0, %24 ], [ %25, %33 ]
%38 = add nuw nsw i64 %12, 2
%39 = add i64 %14, 2
%40 = icmp eq i64 %39, %10
br i1 %40, label %41, label %11
41: ; preds = %36, %5
%42 = phi i32 [ undef, %5 ], [ %37, %36 ]
%43 = phi i64 [ 0, %5 ], [ %38, %36 ]
%44 = phi i32 [ 1, %5 ], [ %37, %36 ]
%45 = icmp eq i64 %7, 0
br i1 %45, label %56, label %46
46: ; preds = %41
%47 = getelementptr inbounds i8, i8* %0, i64 %43
%48 = load i8, i8* %47
%49 = sext i8 %48 to i32
switch i32 %49, label %56 [
i32 65, label %53
i32 67, label %52
i32 71, label %51
i32 84, label %50
]
50: ; preds = %46
br label %53
51: ; preds = %46
br label %53
52: ; preds = %46
br label %53
53: ; preds = %52, %51, %50, %46
%54 = phi i32 [ 1, %52 ], [ 2, %51 ], [ 3, %50 ], [ 0, %46 ]
%55 = getelementptr inbounds i32, i32* %2, i64 %43
store i32 %54, i32* %55
br label %56
56: ; preds = %41, %53, %46, %3
%57 = phi i32 [ 1, %3 ], [ %42, %41 ], [ 0, %46 ], [ %44, %53 ]
ret i32 %57
}