int lsame_(char *ca, char *cb) {
  int ret_val;
  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):
<lsame_>:
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 <lsame_+0x3c>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12fd <lsame_+0x1fd>
movl   $0x5a,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x5a,-0x28(%rbp)
je     116b <lsame_+0x6b>
cmpl   $0x7a,-0x28(%rbp)
jne    11aa <lsame_+0xaa>
cmpl   $0x61,-0x20(%rbp)
jl     1188 <lsame_+0x88>
cmpl   $0x7a,-0x20(%rbp)
jg     1188 <lsame_+0x88>
mov    -0x20(%rbp),%eax
add    $0xffffffe0,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x61,-0x24(%rbp)
jl     11a5 <lsame_+0xa5>
cmpl   $0x7a,-0x24(%rbp)
jg     11a5 <lsame_+0xa5>
mov    -0x24(%rbp),%eax
add    $0xffffffe0,%eax
mov    %eax,-0x24(%rbp)
jmp    12e6 <lsame_+0x1e6>
cmpl   $0xe9,-0x28(%rbp)
je     11c4 <lsame_+0xc4>
cmpl   $0xa9,-0x28(%rbp)
jne    1277 <lsame_+0x177>
cmpl   $0x81,-0x20(%rbp)
jl     11de <lsame_+0xde>
cmpl   $0x89,-0x20(%rbp)
jle    1212 <lsame_+0x112>
cmpl   $0x91,-0x20(%rbp)
jl     11f8 <lsame_+0xf8>
cmpl   $0x99,-0x20(%rbp)
jle    1212 <lsame_+0x112>
cmpl   $0xa2,-0x20(%rbp)
jl     121b <lsame_+0x11b>
cmpl   $0xa9,-0x20(%rbp)
jg     121b <lsame_+0x11b>
mov    -0x20(%rbp),%eax
add    $0x40,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x81,-0x24(%rbp)
jl     1235 <lsame_+0x135>
cmpl   $0x89,-0x24(%rbp)
jle    1269 <lsame_+0x169>
cmpl   $0x91,-0x24(%rbp)
jl     124f <lsame_+0x14f>
cmpl   $0x99,-0x24(%rbp)
jle    1269 <lsame_+0x169>
cmpl   $0xa2,-0x24(%rbp)
jl     1272 <lsame_+0x172>
cmpl   $0xa9,-0x24(%rbp)
jg     1272 <lsame_+0x172>
mov    -0x24(%rbp),%eax
add    $0x40,%eax
mov    %eax,-0x24(%rbp)
jmp    12e1 <lsame_+0x1e1>
cmpl   $0xda,-0x28(%rbp)
je     1291 <lsame_+0x191>
cmpl   $0xfa,-0x28(%rbp)
jne    12dc <lsame_+0x1dc>
cmpl   $0xe1,-0x20(%rbp)
jl     12b4 <lsame_+0x1b4>
cmpl   $0xfa,-0x20(%rbp)
jg     12b4 <lsame_+0x1b4>
mov    -0x20(%rbp),%eax
add    $0xffffffe0,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0xe1,-0x24(%rbp)
jl     12d7 <lsame_+0x1d7>
cmpl   $0xfa,-0x24(%rbp)
jg     12d7 <lsame_+0x1d7>
mov    -0x24(%rbp),%eax
add    $0xffffffe0,%eax
mov    %eax,-0x24(%rbp)
jmp    12dc <lsame_+0x1dc>
jmp    12e1 <lsame_+0x1e1>
jmp    12e6 <lsame_+0x1e6>
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%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):
<lsame_>:
movzbl (%rdi),%edx
movzbl (%rsi),%ecx
mov    $0x1,%eax
cmp    %cl,%dl
je     112c <lsame_+0x2c>
lea    -0x61(%rdx),%eax
lea    -0x20(%rdx),%esi
cmp    $0x1a,%al
cmovae %edx,%esi
lea    -0x61(%rcx),%eax
lea    -0x20(%rcx),%edx
cmp    $0x1a,%al
cmovae %ecx,%edx
xor    %eax,%eax
cmp    %edx,%esi
sete   %al
ret

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

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