int sf_gcWindow(char *seq, int length, int gc_min_percent, int gc_max_percent,
                int window_size, int *window_start, int *gc_count) {
  int i, gc_min, gc_max;
  char *iptr, *mptr, *eptr;
  gc_min = (gc_min_percent * length) / 100;
  gc_max = (gc_max_percent * length) / 100;
  if (window_size > length) {
    return -1;
  }
  *window_start = 0;
  *gc_count = 0;
  iptr = seq;
  mptr = seq;
  eptr = (seq + length);
  for (i = 0; i < window_size; i++) {
    *gc_count += (*mptr == 'G' || *mptr == 'C') ? 1 : 0;
    mptr++;
  }
  if (*gc_count < gc_min || *gc_count > gc_max) {
    return 0;
  }
  while (mptr != eptr) {
    *gc_count -= (*iptr == 'G' || *iptr == 'C') ? 1 : 0;
    *gc_count += (*mptr == 'G' || *mptr == 'C') ? 1 : 0;
    ++*window_start;
    mptr++;
    iptr++;
    if (*gc_count < gc_min || *gc_count > gc_max) {
      return 0;
    }
  }
  return 1;
}


x86 assembly (clang, -O0):
<sf_gcWindow>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x18(%rbp),%eax
imul   -0x14(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
imul   -0x14(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %eax,-0x34(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jle    1159 <sf_gcWindow+0x59>
movl   $0xffffffff,-0x4(%rbp)
jmp    1308 <sf_gcWindow+0x208>
mov    -0x28(%rbp),%rax
movl   $0x0,(%rax)
mov    0x10(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11f6 <sf_gcWindow+0xf6>
mov    -0x48(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x47,%ecx
mov    %al,-0x51(%rbp)
je     11c4 <sf_gcWindow+0xc4>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x43,%eax
sete   %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%dl
xor    %ecx,%ecx
mov    $0x1,%eax
test   $0x1,%dl
cmovne %eax,%ecx
mov    0x10(%rbp),%rax
add    (%rax),%ecx
mov    %ecx,(%rax)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1193 <sf_gcWindow+0x93>
mov    0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x30(%rbp),%eax
jl     1214 <sf_gcWindow+0x114>
mov    0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x34(%rbp),%eax
jle    1220 <sf_gcWindow+0x120>
movl   $0x0,-0x4(%rbp)
jmp    1308 <sf_gcWindow+0x208>
jmp    1225 <sf_gcWindow+0x125>
mov    -0x48(%rbp),%rax
cmp    -0x50(%rbp),%rax
je     1301 <sf_gcWindow+0x201>
mov    -0x40(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x47,%ecx
mov    %al,-0x52(%rbp)
je     1258 <sf_gcWindow+0x158>
mov    -0x40(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x43,%eax
sete   %al
mov    %al,-0x52(%rbp)
mov    -0x52(%rbp),%cl
xor    %edx,%edx
mov    $0x1,%eax
test   $0x1,%cl
cmovne %eax,%edx
mov    0x10(%rbp),%rax
mov    (%rax),%ecx
sub    %edx,%ecx
mov    %ecx,(%rax)
mov    -0x48(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x47,%ecx
mov    %al,-0x53(%rbp)
je     1297 <sf_gcWindow+0x197>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x43,%eax
sete   %al
mov    %al,-0x53(%rbp)
mov    -0x53(%rbp),%dl
xor    %ecx,%ecx
mov    $0x1,%eax
test   $0x1,%dl
cmovne %eax,%ecx
mov    0x10(%rbp),%rax
add    (%rax),%ecx
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x30(%rbp),%eax
jl     12f0 <sf_gcWindow+0x1f0>
mov    0x10(%rbp),%rax
mov    (%rax),%eax
cmp    -0x34(%rbp),%eax
jle    12fc <sf_gcWindow+0x1fc>
movl   $0x0,-0x4(%rbp)
jmp    1308 <sf_gcWindow+0x208>
jmp    1225 <sf_gcWindow+0x125>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sf_gcWindow>:
push   %rbp
push   %r15
push   %r14
push   %rbx
mov    $0xffffffff,%eax
cmp    %esi,%r8d
jg     123d <sf_gcWindow+0x13d>
mov    0x28(%rsp),%r10
imul   %esi,%edx
movslq %edx,%rax
imul   $0x51eb851f,%rax,%r11
mov    %r11,%rax
shr    $0x3f,%rax
sar    $0x25,%r11
add    %eax,%r11d
movl   $0x0,(%r9)
movl   $0x0,(%r10)
xor    %eax,%eax
mov    $0x0,%ebx
mov    %rdi,%r14
test   %r8d,%r8d
jle    11c2 <sf_gcWindow+0xc2>
cmp    $0x1,%r8d
jne    115e <sf_gcWindow+0x5e>
xor    %ebx,%ebx
mov    %rdi,%r14
jmp    11a4 <sf_gcWindow+0xa4>
mov    %r8d,%r15d
and    $0xfffffffe,%r15d
xor    %ebx,%ebx
mov    %rdi,%r14
nopw   0x0(%rax,%rax,1)
movzbl (%r14),%edx
and    $0xfb,%dl
xor    %ebp,%ebp
cmp    $0x43,%dl
sete   %bpl
add    %ebx,%ebp
mov    %ebp,(%r10)
movzbl 0x1(%r14),%edx
and    $0xfb,%dl
xor    %ebx,%ebx
cmp    $0x43,%dl
sete   %bl
add    %ebp,%ebx
mov    %ebx,(%r10)
add    $0x2,%r14
add    $0xfffffffe,%r15d
jne    1170 <sf_gcWindow+0x70>
test   $0x1,%r8b
je     11c2 <sf_gcWindow+0xc2>
mov    (%r14),%dl
and    $0xfb,%dl
xor    %ebp,%ebp
cmp    $0x43,%dl
sete   %bpl
add    %ebp,%ebx
mov    %ebx,(%r10)
add    $0x1,%r14
cmp    %r11d,%ebx
jl     123d <sf_gcWindow+0x13d>
imul   %esi,%ecx
movslq %ecx,%rcx
imul   $0x51eb851f,%rcx,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x25,%rcx
add    %edx,%ecx
cmp    %ecx,%ebx
jg     123d <sf_gcWindow+0x13d>
movslq %esi,%rsi
add    %rdi,%rsi
nopl   0x0(%rax,%rax,1)
cmp    %rsi,%r14
je     1238 <sf_gcWindow+0x138>
movzbl (%rdi),%edx
and    $0xfb,%dl
xor    %ebp,%ebp
cmp    $0x43,%dl
sete   %bpl
sub    %ebp,%ebx
mov    %ebx,(%r10)
movzbl (%r14),%edx
and    $0xfb,%dl
xor    %ebp,%ebp
cmp    $0x43,%dl
sete   %bpl
add    %ebx,%ebp
mov    %ebp,(%r10)
addl   $0x1,(%r9)
mov    (%r10),%ebx
cmp    %r11d,%ebx
jl     123d <sf_gcWindow+0x13d>
add    $0x1,%rdi
add    $0x1,%r14
cmp    %ecx,%ebx
jle    11f0 <sf_gcWindow+0xf0>
jmp    123d <sf_gcWindow+0x13d>
mov    $0x1,%eax
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @sf_gcWindow(i8* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32* nocapture %5, i32* nocapture %6) {
%8 = mul nsw i32 %2, %1
%9 = sdiv i32 %8, 100
%10 = mul nsw i32 %3, %1
%11 = sdiv i32 %10, 100
%12 = icmp sgt i32 %4, %1
br i1 %12, label %83, label %13
13: ; preds = %7
store i32 0, i32* %5
store i32 0, i32* %6
%14 = sext i32 %1 to i64
%15 = getelementptr inbounds i8, i8* %0, i64 %14
%16 = icmp sgt i32 %4, 0
br i1 %16, label %17, label %53
17: ; preds = %13
%18 = and i32 %4, 1
%19 = icmp eq i32 %4, 1
br i1 %19, label %40, label %20
20: ; preds = %17
%21 = and i32 %4, -2
br label %22
22: ; preds = %22, %20
%23 = phi i32 [ 0, %20 ], [ %36, %22 ]
%24 = phi i8* [ %0, %20 ], [ %37, %22 ]
%25 = phi i32 [ 0, %20 ], [ %38, %22 ]
%26 = load i8, i8* %24
%27 = and i8 %26, -5
%28 = icmp eq i8 %27, 67
%29 = zext i1 %28 to i32
%30 = add nuw nsw i32 %23, %29
store i32 %30, i32* %6
%31 = getelementptr inbounds i8, i8* %24, i64 1
%32 = load i8, i8* %31
%33 = and i8 %32, -5
%34 = icmp eq i8 %33, 67
%35 = zext i1 %34 to i32
%36 = add nuw nsw i32 %30, %35
store i32 %36, i32* %6
%37 = getelementptr inbounds i8, i8* %24, i64 2
%38 = add i32 %25, 2
%39 = icmp eq i32 %38, %21
br i1 %39, label %40, label %22
40: ; preds = %22, %17
%41 = phi i32 [ undef, %17 ], [ %36, %22 ]
%42 = phi i8* [ undef, %17 ], [ %37, %22 ]
%43 = phi i32 [ 0, %17 ], [ %36, %22 ]
%44 = phi i8* [ %0, %17 ], [ %37, %22 ]
%45 = icmp eq i32 %18, 0
br i1 %45, label %53, label %46
46: ; preds = %40
%47 = load i8, i8* %44
%48 = and i8 %47, -5
%49 = icmp eq i8 %48, 67
%50 = zext i1 %49 to i32
%51 = add nuw nsw i32 %43, %50
store i32 %51, i32* %6
%52 = getelementptr inbounds i8, i8* %44, i64 1
br label %53
53: ; preds = %46, %40, %13
%54 = phi i32 [ 0, %13 ], [ %41, %40 ], [ %51, %46 ]
%55 = phi i8* [ %0, %13 ], [ %42, %40 ], [ %52, %46 ]
%56 = icmp slt i32 %54, %9
%57 = icmp sgt i32 %54, %11
%58 = select i1 %56, i1 true, i1 %57
br i1 %58, label %83, label %59
59: ; preds = %53, %64
%60 = phi i32 [ %77, %64 ], [ %54, %53 ]
%61 = phi i8* [ %79, %64 ], [ %0, %53 ]
%62 = phi i8* [ %80, %64 ], [ %55, %53 ]
%63 = icmp eq i8* %62, %15
br i1 %63, label %83, label %64
64: ; preds = %59
%65 = load i8, i8* %61
%66 = and i8 %65, -5
%67 = icmp eq i8 %66, 67
%68 = sext i1 %67 to i32
%69 = add i32 %60, %68
store i32 %69, i32* %6
%70 = load i8, i8* %62
%71 = and i8 %70, -5
%72 = icmp eq i8 %71, 67
%73 = zext i1 %72 to i32
%74 = add nsw i32 %69, %73
store i32 %74, i32* %6
%75 = load i32, i32* %5
%76 = add nsw i32 %75, 1
store i32 %76, i32* %5
%77 = load i32, i32* %6
%78 = icmp slt i32 %77, %9
%79 = getelementptr inbounds i8, i8* %61, i64 1
%80 = getelementptr inbounds i8, i8* %62, i64 1
%81 = icmp sgt i32 %77, %11
%82 = select i1 %78, i1 true, i1 %81
br i1 %82, label %83, label %59
83: ; preds = %59, %64, %53, %7
%84 = phi i32 [ -1, %7 ], [ 0, %53 ], [ 1, %59 ], [ 0, %64 ]
ret i32 %84
}