int Compare_char(char *ca, char *cb) {
  int ret_val;
  static int inta, intb, zcode;
  ret_val = *(unsigned char *)ca == *(unsigned char *)cb;
  if (ret_val) {
    return ret_val;
  }
  zcode = 'Z';
  inta = *(unsigned char *)ca;
  intb = *(unsigned char *)cb;
  if (zcode == 90 || zcode == 122) {
    if (inta >= 97 && inta <= 122) {
      inta += -32;
    }
    if (intb >= 97 && intb <= 122) {
      intb += -32;
    }
  } else if (zcode == 233 || zcode == 169) {
    if ((inta >= 129 && inta <= 137) || (inta >= 145 && inta <= 153) ||
        (inta >= 162 && inta <= 169)) {
      inta += 64;
    }
    if ((intb >= 129 && intb <= 137) || (intb >= 145 && intb <= 153) ||
        (intb >= 162 && intb <= 169)) {
      intb += 64;
    }
  } else if (zcode == 218 || zcode == 250) {
    if (inta >= 225 && inta <= 250) {
      inta += -32;
    }
    if (intb >= 225 && intb <= 250) {
      intb += -32;
    }
  }
  ret_val = inta == intb;
  return ret_val;
}


x86 assembly (clang, -O0):
<Compare_char>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movzbl (%rcx),%ecx
cmp    %ecx,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     113c <Compare_char+0x3c>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    137e <Compare_char+0x27e>
movl   $0x5a,0x2ee6(%rip)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,0x2ed1(%rip)
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,0x2ec8(%rip)
cmpl   $0x5a,0x2ec5(%rip)
je     117a <Compare_char+0x7a>
cmpl   $0x7a,0x2eb8(%rip)
jne    11d1 <Compare_char+0xd1>
cmpl   $0x61,0x2ea3(%rip)
jl     11a3 <Compare_char+0xa3>
cmpl   $0x7a,0x2e96(%rip)
jg     11a3 <Compare_char+0xa3>
mov    0x2e8a(%rip),%eax
add    $0xffffffe0,%eax
mov    %eax,0x2e81(%rip)
cmpl   $0x61,0x2e7e(%rip)
jl     11cc <Compare_char+0xcc>
cmpl   $0x7a,0x2e71(%rip)
jg     11cc <Compare_char+0xcc>
mov    0x2e65(%rip),%eax
add    $0xffffffe0,%eax
mov    %eax,0x2e5c(%rip)
jmp    1361 <Compare_char+0x261>
cmpl   $0xe9,0x2e51(%rip)
je     11f1 <Compare_char+0xf1>
cmpl   $0xa9,0x2e41(%rip)
jne    12d4 <Compare_char+0x1d4>
cmpl   $0x81,0x2e29(%rip)
jl     1211 <Compare_char+0x111>
cmpl   $0x89,0x2e19(%rip)
jle    1251 <Compare_char+0x151>
cmpl   $0x91,0x2e09(%rip)
jl     1231 <Compare_char+0x131>
cmpl   $0x99,0x2df9(%rip)
jle    1251 <Compare_char+0x151>
cmpl   $0xa2,0x2de9(%rip)
jl     1260 <Compare_char+0x160>
cmpl   $0xa9,0x2dd9(%rip)
jg     1260 <Compare_char+0x160>
mov    0x2dcd(%rip),%eax
add    $0x40,%eax
mov    %eax,0x2dc4(%rip)
cmpl   $0x81,0x2dbe(%rip)
jl     1280 <Compare_char+0x180>
cmpl   $0x89,0x2dae(%rip)
jle    12c0 <Compare_char+0x1c0>
cmpl   $0x91,0x2d9e(%rip)
jl     12a0 <Compare_char+0x1a0>
cmpl   $0x99,0x2d8e(%rip)
jle    12c0 <Compare_char+0x1c0>
cmpl   $0xa2,0x2d7e(%rip)
jl     12cf <Compare_char+0x1cf>
cmpl   $0xa9,0x2d6e(%rip)
jg     12cf <Compare_char+0x1cf>
mov    0x2d62(%rip),%eax
add    $0x40,%eax
mov    %eax,0x2d59(%rip)
jmp    135c <Compare_char+0x25c>
cmpl   $0xda,0x2d4e(%rip)
je     12f4 <Compare_char+0x1f4>
cmpl   $0xfa,0x2d3e(%rip)
jne    1357 <Compare_char+0x257>
cmpl   $0xe1,0x2d26(%rip)
jl     1323 <Compare_char+0x223>
cmpl   $0xfa,0x2d16(%rip)
jg     1323 <Compare_char+0x223>
mov    0x2d0a(%rip),%eax
add    $0xffffffe0,%eax
mov    %eax,0x2d01(%rip)
cmpl   $0xe1,0x2cfb(%rip)
jl     1352 <Compare_char+0x252>
cmpl   $0xfa,0x2ceb(%rip)
jg     1352 <Compare_char+0x252>
mov    0x2cdf(%rip),%eax
add    $0xffffffe0,%eax
mov    %eax,0x2cd6(%rip)
jmp    1357 <Compare_char+0x257>
jmp    135c <Compare_char+0x25c>
jmp    1361 <Compare_char+0x261>
mov    0x2cbd(%rip),%eax
cmp    0x2cbb(%rip),%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<Compare_char>:
movzbl (%rdi),%edx
movzbl (%rsi),%ecx
mov    $0x1,%eax
cmp    %cl,%dl
je     112e <Compare_char+0x2e>
lea    -0x61(%rdx),%eax
lea    -0x20(%rdx),%esi
cmp    $0x1a,%eax
cmovae %edx,%esi
lea    -0x61(%rcx),%eax
lea    -0x20(%rcx),%edx
cmp    $0x1a,%eax
cmovae %ecx,%edx
xor    %eax,%eax
cmp    %edx,%esi
sete   %al
ret

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

LLVM IR (-O2):
define i32 @Compare_char(i8* nocapture %0, i8* nocapture %1) {
%3 = load i8, i8* %0
%4 = load i8, i8* %1
%5 = icmp eq i8 %3, %4
br i1 %5, label %19, label %6
6: ; preds = %2
%7 = zext i8 %3 to i32
%8 = zext i8 %4 to i32
%9 = add nsw i32 %7, -97
%10 = icmp ult i32 %9, 26
%11 = add nsw i32 %7, -32
%12 = select i1 %10, i32 %11, i32 %7
%13 = add nsw i32 %8, -97
%14 = icmp ult i32 %13, 26
%15 = add nsw i32 %8, -32
%16 = select i1 %14, i32 %15, i32 %8
%17 = icmp eq i32 %12, %16
%18 = zext i1 %17 to i32
br label %19
19: ; preds = %2, %6
%20 = phi i32 [ %18, %6 ], [ 1, %2 ]
ret i32 %20
}