void basepairing(char *ptr, int npair, int lpair, int *ncomp) {
  int n;
  *ncomp = 0;
  for (n = 0; n < npair; n++) {
    if ((*(ptr + lpair - n) == 'n') && (*(ptr + n) != 'n')) {
      (*ncomp)++;
    } else {
      switch (*(ptr + n)) {
      case 'a':
        if (*(ptr + lpair - n) == 't')
          (*ncomp)++;
        break;
      case 'c':
        if (*(ptr + lpair - n) == 'g')
          (*ncomp)++;
        break;
      case 'g':
      case 'r':
        if ((*(ptr + lpair - n) == 'c') || (*(ptr + lpair - n) == 't'))
          (*ncomp)++;
        break;
      case 't':
      case 'y':
        if ((*(ptr + lpair - n) == 'a') || (*(ptr + lpair - n) == 'g'))
          (*ncomp)++;
        break;
      case 'n':
        if (*(ptr + lpair - n) != 'n')
          (*ncomp)++;
        break;
      }
    }
  }
}


x86 assembly (clang, -O0):
<basepairing>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12f6 <basepairing+0x1f6>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6e,%eax
jne    1175 <basepairing+0x75>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6e,%eax
je     1175 <basepairing+0x75>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    12e3 <basepairing+0x1e3>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xffffff9f,%eax
mov    %eax,%ecx
mov    %rcx,-0x28(%rbp)
sub    $0x18,%eax
ja     12de <basepairing+0x1de>
mov    -0x28(%rbp),%rax
lea    0xe62(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x74,%eax
jne    11d3 <basepairing+0xd3>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    12de <basepairing+0x1de>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x67,%eax
jne    1204 <basepairing+0x104>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    12de <basepairing+0x1de>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x63,%eax
je     124b <basepairing+0x14b>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x74,%eax
jne    1256 <basepairing+0x156>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    12de <basepairing+0x1de>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
je     129d <basepairing+0x19d>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x67,%eax
jne    12a8 <basepairing+0x1a8>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    12de <basepairing+0x1de>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
add    %rcx,%rax
movslq -0x1c(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6e,%eax
je     12d9 <basepairing+0x1d9>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    12de <basepairing+0x1de>
jmp    12e3 <basepairing+0x1e3>
jmp    12e8 <basepairing+0x1e8>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1123 <basepairing+0x23>
pop    %rbp
ret

x86 assembly (clang, -O2):
<basepairing>:
movl   $0x0,(%rcx)
test   %esi,%esi
jle    1190 <basepairing+0x90>
movslq %edx,%r9
add    %rdi,%r9
mov    %esi,%r10d
neg    %r10
xor    %esi,%esi
lea    0xedd(%rip),%r8
xor    %r11d,%r11d
jmp    1144 <basepairing+0x44>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r11d
mov    %r11d,(%rcx)
add    $0x1,%rdi
add    $0xffffffffffffffff,%rsi
cmp    %rsi,%r10
je     1190 <basepairing+0x90>
movzbl (%r9,%rsi,1),%edx
movsbl (%rdi),%eax
cmp    $0x6e,%dl
jne    1160 <basepairing+0x60>
cmp    $0x6e,%al
jne    1130 <basepairing+0x30>
jmp    1137 <basepairing+0x37>
nopw   0x0(%rax,%rax,1)
add    $0xffffff9f,%eax
cmp    $0x18,%eax
ja     1137 <basepairing+0x37>
movslq (%r8,%rax,4),%rax
add    %r8,%rax
jmp    *%rax
cmp    $0x63,%dl
je     1130 <basepairing+0x30>
cmp    $0x74,%dl
je     1130 <basepairing+0x30>
jmp    1137 <basepairing+0x37>
cmp    $0x67,%dl
je     1130 <basepairing+0x30>
cmp    $0x61,%dl
je     1130 <basepairing+0x30>
jmp    1137 <basepairing+0x37>
cmp    $0x67,%dl
je     1130 <basepairing+0x30>
jmp    1137 <basepairing+0x37>
ret

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

LLVM IR (-O2):
define void @basepairing(i8* nocapture %0, i32 %1, i32 %2, i32* nocapture %3) {
store i32 0, i32* %3
%5 = icmp sgt i32 %1, 0
br i1 %5, label %6, label %35
6: ; preds = %4
%7 = sext i32 %2 to i64
%8 = getelementptr inbounds i8, i8* %0, i64 %7
%9 = zext i32 %1 to i64
br label %10
10: ; preds = %6, %31
%11 = phi i32 [ 0, %6 ], [ %32, %31 ]
%12 = phi i64 [ 0, %6 ], [ %33, %31 ]
%13 = sub nsw i64 0, %12
%14 = getelementptr inbounds i8, i8* %8, i64 %13
%15 = load i8, i8* %14
%16 = icmp eq i8 %15, 110
%17 = getelementptr inbounds i8, i8* %0, i64 %12
%18 = load i8, i8* %17
br i1 %16, label %19, label %21
19: ; preds = %10
%20 = icmp eq i8 %18, 110
br i1 %20, label %31, label %29
21: ; preds = %10
%22 = sext i8 %18 to i32
switch i32 %22, label %31 [
i32 97, label %23
i32 99, label %25
i32 103, label %27
i32 114, label %27
i32 116, label %28
i32 121, label %28
i32 110, label %29
]
23: ; preds = %21
%24 = icmp eq i8 %15, 116
br i1 %24, label %29, label %31
25: ; preds = %21
%26 = icmp eq i8 %15, 103
br i1 %26, label %29, label %31
27: ; preds = %21, %21
switch i8 %15, label %31 [
i8 99, label %29
i8 116, label %29
]
28: ; preds = %21, %21
switch i8 %15, label %31 [
i8 97, label %29
i8 103, label %29
]
29: ; preds = %21, %28, %28, %27, %27, %25, %23, %19
%30 = add nsw i32 %11, 1
store i32 %30, i32* %3
br label %31
31: ; preds = %29, %19, %28, %27, %25, %23, %21
%32 = phi i32 [ %11, %28 ], [ %11, %27 ], [ %11, %25 ], [ %11, %23 ], [ %11, %21 ], [ %11, %19 ], [ %30, %29 ]
%33 = add nuw nsw i64 %12, 1
%34 = icmp eq i64 %33, %9
br i1 %34, label %35, label %10
35: ; preds = %31, %4
ret void
}