int match(n, t)
char *n;
char *t;
{
  upper(n);
  upper(t);
  while ((*n && *n != '.') || (*t && *t != '.')) {
    if (*n != *t && *t != '?') {
      if (*t != '*')
        return 0;
      else {
        while (*n && *n != '.')
          n++;
        while (*t && *t != '.')
          t++;
        break;
      }
    } else {
      n++;
      t++;
    }
  }
  if (*n && *n == '.')
    n++;
  if (*t && *t == '.')
    t++;
  while (*n || *t) {
    if (*n != *t && *t != '?') {
      if (*t != '*')
        return 0;
      else
        return 1;
    } else {
      n++;
      t++;
    }
  }
  return 1;
}


x86 assembly (clang, -O0):
<match>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x0,%al
call   1030 <upper@plt>
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1030 <upper@plt>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     115b <match+0x4b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x2e,%ecx
mov    %al,-0x19(%rbp)
jne    1186 <match+0x76>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1a(%rbp)
je     1180 <match+0x70>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
setne  %al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
test   $0x1,%al
jne    1196 <match+0x86>
jmp    1290 <match+0x180>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     1273 <match+0x163>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3f,%eax
je     1273 <match+0x163>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
je     11d8 <match+0xc8>
movl   $0x0,-0x4(%rbp)
jmp    1394 <match+0x284>
jmp    11dd <match+0xcd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1b(%rbp)
je     1202 <match+0xf2>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
setne  %al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%al
test   $0x1,%al
jne    1212 <match+0x102>
jmp    1223 <match+0x113>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11dd <match+0xcd>
jmp    1228 <match+0x118>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1c(%rbp)
je     124d <match+0x13d>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
setne  %al
mov    %al,-0x1c(%rbp)
mov    -0x1c(%rbp),%al
test   $0x1,%al
jne    125d <match+0x14d>
jmp    126e <match+0x15e>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1228 <match+0x118>
jmp    1290 <match+0x180>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1136 <match+0x26>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     12bc <match+0x1ac>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    12bc <match+0x1ac>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     12e8 <match+0x1d8>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    12e8 <match+0x1d8>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    12ed <match+0x1dd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x0,%ecx
mov    %al,-0x1d(%rbp)
jne    1312 <match+0x202>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
test   $0x1,%al
jne    1322 <match+0x212>
jmp    138d <match+0x27d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     1370 <match+0x260>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3f,%eax
je     1370 <match+0x260>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
je     1364 <match+0x254>
movl   $0x0,-0x4(%rbp)
jmp    1394 <match+0x284>
movl   $0x1,-0x4(%rbp)
jmp    1394 <match+0x284>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    12ed <match+0x1dd>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<match>:
push   %r15
push   %r14
push   %rbx
mov    %rsi,%r14
mov    %rdi,%r15
xor    %eax,%eax
call   1030 <upper@plt>
mov    %r14,%rdi
xor    %eax,%eax
call   1030 <upper@plt>
jmp    1138 <match+0x28>
xchg   %ax,%ax
add    $0x1,%r15
add    $0x1,%r14
movzbl (%r15),%ecx
cmp    $0x2e,%cl
je     1145 <match+0x35>
test   %cl,%cl
jne    1160 <match+0x50>
movzbl (%r14),%edx
test   %dl,%dl
je     11b2 <match+0xa2>
cmp    $0x2e,%dl
je     11b2 <match+0xa2>
cmp    %dl,%cl
jne    1168 <match+0x58>
jmp    1130 <match+0x20>
nopl   0x0(%rax,%rax,1)
movzbl (%r14),%edx
cmp    %dl,%cl
je     1130 <match+0x20>
cmp    $0x3f,%dl
je     1130 <match+0x20>
xor    %eax,%eax
cmp    $0x2a,%dl
jne    1215 <match+0x105>
nopl   0x0(%rax,%rax,1)
cmp    $0x2e,%cl
je     1197 <match+0x87>
test   %cl,%cl
je     1197 <match+0x87>
movzbl 0x1(%r15),%ecx
add    $0x1,%r15
cmp    $0x2e,%cl
jne    1185 <match+0x75>
mov    $0x2a,%dl
test   %dl,%dl
je     11b2 <match+0xa2>
nopl   (%rax)
cmp    $0x2e,%dl
je     11b2 <match+0xa2>
movzbl 0x1(%r14),%edx
add    $0x1,%r14
test   %dl,%dl
jne    11a0 <match+0x90>
xor    %esi,%esi
cmp    $0x2e,%cl
sete   %sil
xor    %edi,%edi
cmp    $0x2e,%dl
sete   %dil
mov    (%r15,%rsi,1),%bl
mov    (%r14,%rdi,1),%cl
mov    $0x1,%eax
mov    %ebx,%edx
or     %cl,%dl
je     1215 <match+0x105>
add    %rsi,%r15
add    %rdi,%r14
mov    $0x1,%esi
jmp    1204 <match+0xf4>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%r15,%rsi,1),%ebx
movzbl (%r14,%rsi,1),%ecx
add    $0x1,%rsi
mov    %ebx,%edx
or     %cl,%dl
je     1215 <match+0x105>
cmp    %cl,%bl
je     11f0 <match+0xe0>
cmp    $0x3f,%cl
je     11f0 <match+0xe0>
xor    %eax,%eax
cmp    $0x2a,%cl
sete   %al
pop    %rbx
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
define i32 @match(i8* %0, i8* %1) {
%3 = tail call i32 (i8*, ...) bitcast (i32 (...)* @upper to i32 (i8*, ...)*)(i8* %0)
%4 = tail call i32 (i8*, ...) bitcast (i32 (...)* @upper to i32 (i8*, ...)*)(i8* %1)
br label %5
5: ; preds = %33, %2
%6 = phi i8* [ %0, %2 ], [ %34, %33 ]
%7 = phi i8* [ %1, %2 ], [ %35, %33 ]
%8 = load i8, i8* %6
switch i8 %8, label %11 [
i8 0, label %9
i8 46, label %9
]
9: ; preds = %5, %5
%10 = load i8, i8* %7
switch i8 %10, label %13 [
i8 0, label %36
i8 46, label %36
]
11: ; preds = %5
%12 = load i8, i8* %7
br label %13
13: ; preds = %11, %9
%14 = phi i8 [ %12, %11 ], [ %10, %9 ]
%15 = icmp eq i8 %8, %14
%16 = icmp eq i8 %14, 63
%17 = or i1 %15, %16
br i1 %17, label %33, label %18
18: ; preds = %13
%19 = icmp eq i8 %14, 42
br i1 %19, label %20, label %71
20: ; preds = %18, %24
%21 = phi i8 [ %26, %24 ], [ %8, %18 ]
%22 = phi i8* [ %25, %24 ], [ %6, %18 ]
switch i8 %21, label %24 [
i8 0, label %23
i8 46, label %23
]
23: ; preds = %20, %20
br label %27
24: ; preds = %20
%25 = getelementptr inbounds i8, i8* %22, i64 1
%26 = load i8, i8* %25
br label %20
27: ; preds = %23, %30
%28 = phi i8 [ %32, %30 ], [ 42, %23 ]
%29 = phi i8* [ %31, %30 ], [ %7, %23 ]
switch i8 %28, label %30 [
i8 0, label %36
i8 46, label %36
]
30: ; preds = %27
%31 = getelementptr inbounds i8, i8* %29, i64 1
%32 = load i8, i8* %31
br label %27
33: ; preds = %13
%34 = getelementptr inbounds i8, i8* %6, i64 1
%35 = getelementptr inbounds i8, i8* %7, i64 1
br label %5
36: ; preds = %9, %9, %27, %27
%37 = phi i8 [ %28, %27 ], [ %28, %27 ], [ %10, %9 ], [ %10, %9 ]
%38 = phi i8 [ %21, %27 ], [ %21, %27 ], [ %8, %9 ], [ %8, %9 ]
%39 = phi i8* [ %22, %27 ], [ %22, %27 ], [ %6, %9 ], [ %6, %9 ]
%40 = phi i8* [ %29, %27 ], [ %29, %27 ], [ %7, %9 ], [ %7, %9 ]
%41 = icmp eq i8 %38, 46
%42 = zext i1 %41 to i64
%43 = getelementptr i8, i8* %39, i64 %42
%44 = icmp eq i8 %37, 46
%45 = zext i1 %44 to i64
%46 = getelementptr i8, i8* %40, i64 %45
%47 = load i8, i8* %43
%48 = icmp eq i8 %47, 0
%49 = load i8, i8* %46
%50 = icmp eq i8 %49, 0
%51 = select i1 %48, i1 %50, i1 false
br i1 %51, label %71, label %52
52: ; preds = %36, %63
%53 = phi i8 [ %68, %63 ], [ %49, %36 ]
%54 = phi i8 [ %66, %63 ], [ %47, %36 ]
%55 = phi i8* [ %65, %63 ], [ %46, %36 ]
%56 = phi i8* [ %64, %63 ], [ %43, %36 ]
%57 = icmp eq i8 %54, %53
%58 = icmp eq i8 %53, 63
%59 = or i1 %57, %58
br i1 %59, label %63, label %60
60: ; preds = %52
%61 = icmp eq i8 %53, 42
%62 = zext i1 %61 to i32
br label %71
63: ; preds = %52
%64 = getelementptr inbounds i8, i8* %56, i64 1
%65 = getelementptr inbounds i8, i8* %55, i64 1
%66 = load i8, i8* %64
%67 = icmp eq i8 %66, 0
%68 = load i8, i8* %65
%69 = icmp eq i8 %68, 0
%70 = select i1 %67, i1 %69, i1 false
br i1 %70, label %71, label %52
71: ; preds = %63, %36, %60, %18
%72 = phi i32 [ 0, %18 ], [ %62, %60 ], [ 1, %36 ], [ 1, %63 ]
ret i32 %72
}