int isGz(unsigned char *memgz, long memgzlen) {
  int gzpos = 0, flags = 0;
  if (memgzlen < 16)
    return (0);
  if ((memgz[gzpos++] != 0x1F) || (memgz[gzpos++] != 0x8B))
    return (0);
  if (memgz[memgzlen - 4] + memgz[memgzlen - 3] + memgz[memgzlen - 2] +
          memgz[memgzlen - 1] ==
      0)
    return (0);
  if ((memgz[gzpos] != 0) && (memgz[gzpos++] != 8))
    return (0);
  flags = memgz[gzpos++];
  gzpos += 6;
  if (flags & 4) {
    int extrafieldlen;
    extrafieldlen = memgz[gzpos++];
    extrafieldlen <<= 8;
    extrafieldlen |= memgz[gzpos++];
    gzpos += extrafieldlen;
  }
  if (flags & 8) {
    for (;;) {
      if (gzpos >= memgzlen)
        return (0);
      if (memgz[gzpos++] == 0)
        break;
    }
  }
  if (flags & 16) {
    for (;;) {
      if (gzpos >= memgzlen)
        return (0);
      if (memgz[gzpos++] == 0)
        break;
    }
  }
  return (1);
}


x86 assembly (clang, -O0):
<isGz>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
cmpq   $0x10,-0x18(%rbp)
jge    1131 <isGz+0x31>
movl   $0x0,-0x4(%rbp)
jmp    134f <isGz+0x24f>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x1f,%eax
jne    1171 <isGz+0x71>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x8b,%eax
je     117d <isGz+0x7d>
movl   $0x0,-0x4(%rbp)
jmp    134f <isGz+0x24f>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x4,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rdx
sub    $0x3,%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rdx
sub    $0x2,%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rdx
sub    $0x1,%rdx
movzbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
cmp    $0x0,%eax
jne    11d8 <isGz+0xd8>
movl   $0x0,-0x4(%rbp)
jmp    134f <isGz+0x24f>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1218 <isGz+0x118>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x8,%eax
je     1218 <isGz+0x118>
movl   $0x0,-0x4(%rbp)
jmp    134f <isGz+0x24f>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x6,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     1290 <isGz+0x190>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x8,%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
or     -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     12ec <isGz+0x1ec>
jmp    12a4 <isGz+0x1a4>
movslq -0x1c(%rbp),%rax
cmp    -0x18(%rbp),%rax
jl     12be <isGz+0x1be>
movl   $0x0,-0x4(%rbp)
jmp    134f <isGz+0x24f>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    12e2 <isGz+0x1e2>
jmp    12e7 <isGz+0x1e7>
jmp    12a4 <isGz+0x1a4>
jmp    12ec <isGz+0x1ec>
mov    -0x20(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1348 <isGz+0x248>
jmp    1300 <isGz+0x200>
movslq -0x1c(%rbp),%rax
cmp    -0x18(%rbp),%rax
jl     131a <isGz+0x21a>
movl   $0x0,-0x4(%rbp)
jmp    134f <isGz+0x24f>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    133e <isGz+0x23e>
jmp    1343 <isGz+0x243>
jmp    1300 <isGz+0x200>
jmp    1348 <isGz+0x248>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<isGz>:
xor    %eax,%eax
cmp    $0x10,%rsi
jl     1198 <isGz+0x98>
cmpb   $0x1f,(%rdi)
jne    1198 <isGz+0x98>
cmpb   $0x8b,0x1(%rdi)
jne    1198 <isGz+0x98>
movzbl -0x4(%rsi,%rdi,1),%ecx
movzbl -0x3(%rsi,%rdi,1),%edx
add    %ecx,%edx
movzbl -0x2(%rsi,%rdi,1),%ecx
add    %edx,%ecx
movzbl -0x1(%rsi,%rdi,1),%edx
add    %ecx,%edx
je     1198 <isGz+0x98>
mov    0x2(%rdi),%cl
cmp    $0x8,%cl
je     1145 <isGz+0x45>
test   %cl,%cl
je     1193 <isGz+0x93>
jmp    1198 <isGz+0x98>
movzbl 0x3(%rdi),%r8d
mov    $0xa,%ecx
test   $0x4,%r8b
je     1161 <isGz+0x61>
movzwl 0xa(%rdi),%ecx
shl    $0x10,%ecx
bswap  %ecx
add    $0xc,%ecx
test   $0x8,%r8b
je     117b <isGz+0x7b>
mov    %ecx,%edx
cmp    %rsi,%rdx
jge    1198 <isGz+0x98>
lea    0x1(%rdx),%rcx
cmpb   $0x0,(%rdi,%rdx,1)
mov    %rcx,%rdx
jne    1169 <isGz+0x69>
test   $0x10,%r8b
je     1193 <isGz+0x93>
movslq %ecx,%rcx
cmp    %rsi,%rcx
jge    1198 <isGz+0x98>
cmpb   $0x0,(%rdi,%rcx,1)
lea    0x1(%rcx),%rcx
jne    1184 <isGz+0x84>
mov    $0x1,%eax
ret

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

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