#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int uint16_t;

/* Variables and functions */
uint16_t unicode_tolower(uint16_t c) {
  static const unsigned char basic_latin[0x100] = {
      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
      0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
      0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
      0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
      0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
      0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73,
      0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
      0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
      0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
      0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
      0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
      0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
      0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
      0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
      0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
      0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
      0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7,
      0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
      0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
      0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
      0xfc, 0xfd, 0xfe, 0xff};
  static const unsigned char latin_extended_a[0x80] = {
      0x01, 0x01, 0x03, 0x03, 0x05, 0x05, 0x07, 0x07, 0x09, 0x09, 0x0b, 0x0b,
      0x0d, 0x0d, 0x0f, 0x0f, 0x11, 0x11, 0x13, 0x13, 0x15, 0x15, 0x17, 0x17,
      0x19, 0x19, 0x1b, 0x1b, 0x1d, 0x1d, 0x1f, 0x1f, 0x21, 0x21, 0x23, 0x23,
      0x25, 0x25, 0x27, 0x27, 0x29, 0x29, 0x2b, 0x2b, 0x2d, 0x2d, 0x2f, 0x2f,
      0x00, 0x31, 0x33, 0x33, 0x35, 0x35, 0x37, 0x37, 0x38, 0x3a, 0x3a, 0x3c,
      0x3c, 0x3e, 0x3e, 0x40, 0x40, 0x42, 0x42, 0x44, 0x44, 0x46, 0x46, 0x48,
      0x48, 0x49, 0x4b, 0x4b, 0x4d, 0x4d, 0x4f, 0x4f, 0x51, 0x51, 0x53, 0x53,
      0x55, 0x55, 0x57, 0x57, 0x59, 0x59, 0x5b, 0x5b, 0x5d, 0x5d, 0x5f, 0x5f,
      0x61, 0x61, 0x63, 0x63, 0x65, 0x65, 0x67, 0x67, 0x69, 0x69, 0x6b, 0x6b,
      0x6d, 0x6d, 0x6f, 0x6f, 0x71, 0x71, 0x73, 0x73, 0x75, 0x75, 0x77, 0x77,
      0x00, 0x7a, 0x7a, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f};
  static const unsigned char greek[0x50] = {
      0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0xac, 0x87, 0xad, 0xae, 0xaf, 0x8b,
      0xcc, 0x8d, 0xcd, 0xce, 0x90, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
      0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xa2, 0xc3,
      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xac, 0xad, 0xae, 0xaf,
      0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
      0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
      0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf};
  static const unsigned char cyrillic[0x60] = {
      0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b,
      0x5c, 0x5d, 0x5e, 0x5f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
      0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43,
      0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
      0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
      0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
      0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f};
  if (c < 0x0100)
    c = basic_latin[c];
  else if (c == 0x0130)
    c = 0x0069;
  else if (c == 0x0178)
    c = 0x00ff;
  else if (c < 0x0180)
    c = latin_extended_a[c - 0x100] + 0x100;
  else if (c >= 0x380 && c < 0x3d0)
    c = greek[c - 0x380] + 0x300;
  else if (c >= 0x400 && c < 0x460)
    c = cyrillic[c - 0x400] + 0x400;
  return c;
}


x86 assembly (clang, -O0):
<unicode_tolower>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
cmpl   $0x100,-0x4(%rbp)
jge    112b <unicode_tolower+0x2b>
movslq -0x4(%rbp),%rcx
lea    0xee1(%rip),%rax
movzbl (%rax,%rcx,1),%eax
mov    %eax,-0x4(%rbp)
jmp    121b <unicode_tolower+0x11b>
cmpl   $0x130,-0x4(%rbp)
jne    1144 <unicode_tolower+0x44>
movl   $0x69,-0x4(%rbp)
jmp    1216 <unicode_tolower+0x116>
cmpl   $0x178,-0x4(%rbp)
jne    115d <unicode_tolower+0x5d>
movl   $0xff,-0x4(%rbp)
jmp    1211 <unicode_tolower+0x111>
cmpl   $0x180,-0x4(%rbp)
jge    118d <unicode_tolower+0x8d>
mov    -0x4(%rbp),%eax
sub    $0x100,%eax
movslq %eax,%rcx
lea    0xf84(%rip),%rax
movzbl (%rax,%rcx,1),%eax
add    $0x100,%eax
mov    %eax,-0x4(%rbp)
jmp    120c <unicode_tolower+0x10c>
cmpl   $0x380,-0x4(%rbp)
jl     11ca <unicode_tolower+0xca>
cmpl   $0x3d0,-0x4(%rbp)
jge    11ca <unicode_tolower+0xca>
mov    -0x4(%rbp),%eax
sub    $0x380,%eax
movslq %eax,%rcx
lea    0xfc7(%rip),%rax
movzbl (%rax,%rcx,1),%eax
add    $0x300,%eax
mov    %eax,-0x4(%rbp)
jmp    1207 <unicode_tolower+0x107>
cmpl   $0x400,-0x4(%rbp)
jl     1202 <unicode_tolower+0x102>
cmpl   $0x460,-0x4(%rbp)
jge    1202 <unicode_tolower+0x102>
mov    -0x4(%rbp),%eax
sub    $0x400,%eax
movslq %eax,%rcx
lea    0xfda(%rip),%rax
movzbl (%rax,%rcx,1),%eax
add    $0x400,%eax
mov    %eax,-0x4(%rbp)
jmp    1207 <unicode_tolower+0x107>
jmp    120c <unicode_tolower+0x10c>
jmp    1211 <unicode_tolower+0x111>
jmp    1216 <unicode_tolower+0x116>
jmp    121b <unicode_tolower+0x11b>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<unicode_tolower>:
mov    %edi,%eax
cmp    $0xff,%edi
jg     1118 <unicode_tolower+0x18>
cltq
lea    0xeed(%rip),%rcx
movzbl (%rax,%rcx,1),%eax
ret
cmp    $0x130,%eax
je     112c <unicode_tolower+0x2c>
cmp    $0x178,%eax
jne    1132 <unicode_tolower+0x32>
mov    $0xff,%eax
ret
mov    $0x69,%eax
ret
cmp    $0x17f,%eax
ja     114f <unicode_tolower+0x4f>
add    $0xffffff00,%eax
lea    0xfbb(%rip),%rcx
movzbl (%rax,%rcx,1),%eax
or     $0x100,%eax
ret
lea    -0x380(%rax),%ecx
cmp    $0x4f,%ecx
ja     116d <unicode_tolower+0x6d>
mov    %ecx,%eax
lea    0x101d(%rip),%rcx
movzbl (%rax,%rcx,1),%eax
or     $0x300,%eax
ret
lea    -0x400(%rax),%ecx
cmp    $0x5f,%ecx
ja     118a <unicode_tolower+0x8a>
mov    %ecx,%eax
lea    0x104f(%rip),%rcx
movzbl (%rax,%rcx,1),%eax
or     $0x400,%eax
ret

LLVM IR (-O0):
@unicode_tolower.basic_latin = internal constant [256 x i8] c"\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F\10\11\12\13\14\15\16\17\18\19\1A\1B\1C\1D\1E\1F !\22#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\7F\80\81\82\83\84\85\86\87\88\89\8A\8B\8C\8D\8E\8F\90\91\92\93\94\95\96\97\98\99\9A\9B\9C\9D\9E\9F\A0\A1\A2\A3\A4\A5\A6\A7\A8\A9\AA\AB\AC\AD\AE\AF\B0\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\E0\E1\E2\E3\E4\E5\E6\E7\E8\E9\EA\EB\EC\ED\EE\EF\F0\F1\F2\F3\F4\F5\F6\D7\F8\F9\FA\FB\FC\FD\FE\DF\E0\E1\E2\E3\E4\E5\E6\E7\E8\E9\EA\EB\EC\ED\EE\EF\F0\F1\F2\F3\F4\F5\F6\F7\F8\F9\FA\FB\FC\FD\FE\FF"
@unicode_tolower.latin_extended_a = internal constant [128 x i8] c"\01\01\03\03\05\05\07\07\09\09\0B\0B\0D\0D\0F\0F\11\11\13\13\15\15\17\17\19\19\1B\1B\1D\1D\1F\1F!!##%%''))++--//\0013355778::<<>>@@BBDDFFHHIKKMMOOQQSSUUWWYY[[]]__aacceeggiikkmmooqqssuuww\00zz||~~\7F"
@unicode_tolower.greek = internal constant [80 x i8] c"\80\81\82\83\84\85\AC\87\AD\AE\AF\8B\CC\8D\CD\CE\90\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\C0\C1\A2\C3\C4\C5\C6\C7\C8\C9\CA\CB\AC\AD\AE\AF\B0\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\C0\C1\C2\C3\C4\C5\C6\C7\C8\C9\CA\CB\CC\CD\CE\CF"
@unicode_tolower.cyrillic = internal constant [96 x i8] c"PQRSTUVWXYZ[\\]^_0123456789:;<=>?@ABCDEFGHIJKLMNO0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
define i32 @unicode_tolower(i32 %0) {
%2 = alloca i32
store i32 %0, i32* %2
%3 = load i32, i32* %2
%4 = icmp slt i32 %3, 256
br i1 %4, label %5, label %11
5: ; preds = %1
%6 = load i32, i32* %2
%7 = sext i32 %6 to i64
%8 = getelementptr inbounds [256 x i8], [256 x i8]* @unicode_tolower.basic_latin, i64 0, i64 %7
%9 = load i8, i8* %8
%10 = zext i8 %9 to i32
store i32 %10, i32* %2
br label %63
11: ; preds = %1
%12 = load i32, i32* %2
%13 = icmp eq i32 %12, 304
br i1 %13, label %14, label %15
14: ; preds = %11
store i32 105, i32* %2
br label %62
15: ; preds = %11
%16 = load i32, i32* %2
%17 = icmp eq i32 %16, 376
br i1 %17, label %18, label %19
18: ; preds = %15
store i32 255, i32* %2
br label %61
19: ; preds = %15
%20 = load i32, i32* %2
%21 = icmp slt i32 %20, 384
br i1 %21, label %22, label %30
22: ; preds = %19
%23 = load i32, i32* %2
%24 = sub nsw i32 %23, 256
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [128 x i8], [128 x i8]* @unicode_tolower.latin_extended_a, i64 0, i64 %25
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = add nsw i32 %28, 256
store i32 %29, i32* %2
br label %60
30: ; preds = %19
%31 = load i32, i32* %2
%32 = icmp sge i32 %31, 896
br i1 %32, label %33, label %44
33: ; preds = %30
%34 = load i32, i32* %2
%35 = icmp slt i32 %34, 976
br i1 %35, label %36, label %44
36: ; preds = %33
%37 = load i32, i32* %2
%38 = sub nsw i32 %37, 896
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds [80 x i8], [80 x i8]* @unicode_tolower.greek, i64 0, i64 %39
%41 = load i8, i8* %40
%42 = zext i8 %41 to i32
%43 = add nsw i32 %42, 768
store i32 %43, i32* %2
br label %59
44: ; preds = %33, %30
%45 = load i32, i32* %2
%46 = icmp sge i32 %45, 1024
br i1 %46, label %47, label %58
47: ; preds = %44
%48 = load i32, i32* %2
%49 = icmp slt i32 %48, 1120
br i1 %49, label %50, label %58
50: ; preds = %47
%51 = load i32, i32* %2
%52 = sub nsw i32 %51, 1024
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds [96 x i8], [96 x i8]* @unicode_tolower.cyrillic, i64 0, i64 %53
%55 = load i8, i8* %54
%56 = zext i8 %55 to i32
%57 = add nsw i32 %56, 1024
store i32 %57, i32* %2
br label %58
58: ; preds = %50, %47, %44
br label %59
59: ; preds = %58, %36
br label %60
60: ; preds = %59, %22
br label %61
61: ; preds = %60, %18
br label %62
62: ; preds = %61, %14
br label %63
63: ; preds = %62, %5
%64 = load i32, i32* %2
ret i32 %64
}

LLVM IR (-O2):
@unicode_tolower.basic_latin = internal unnamed_addr constant [256 x i8] c"\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F\10\11\12\13\14\15\16\17\18\19\1A\1B\1C\1D\1E\1F !\22#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\7F\80\81\82\83\84\85\86\87\88\89\8A\8B\8C\8D\8E\8F\90\91\92\93\94\95\96\97\98\99\9A\9B\9C\9D\9E\9F\A0\A1\A2\A3\A4\A5\A6\A7\A8\A9\AA\AB\AC\AD\AE\AF\B0\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\E0\E1\E2\E3\E4\E5\E6\E7\E8\E9\EA\EB\EC\ED\EE\EF\F0\F1\F2\F3\F4\F5\F6\D7\F8\F9\FA\FB\FC\FD\FE\DF\E0\E1\E2\E3\E4\E5\E6\E7\E8\E9\EA\EB\EC\ED\EE\EF\F0\F1\F2\F3\F4\F5\F6\F7\F8\F9\FA\FB\FC\FD\FE\FF"
@unicode_tolower.latin_extended_a = internal unnamed_addr constant [128 x i8] c"\01\01\03\03\05\05\07\07\09\09\0B\0B\0D\0D\0F\0F\11\11\13\13\15\15\17\17\19\19\1B\1B\1D\1D\1F\1F!!##%%''))++--//\0013355778::<<>>@@BBDDFFHHIKKMMOOQQSSUUWWYY[[]]__aacceeggiikkmmooqqssuuww\00zz||~~\7F"
@unicode_tolower.greek = internal unnamed_addr constant [80 x i8] c"\80\81\82\83\84\85\AC\87\AD\AE\AF\8B\CC\8D\CD\CE\90\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\C0\C1\A2\C3\C4\C5\C6\C7\C8\C9\CA\CB\AC\AD\AE\AF\B0\B1\B2\B3\B4\B5\B6\B7\B8\B9\BA\BB\BC\BD\BE\BF\C0\C1\C2\C3\C4\C5\C6\C7\C8\C9\CA\CB\CC\CD\CE\CF"
@unicode_tolower.cyrillic = internal unnamed_addr constant [96 x i8] c"PQRSTUVWXYZ[\\]^_0123456789:;<=>?@ABCDEFGHIJKLMNO0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
define i32 @unicode_tolower(i32 %0) {
%2 = icmp slt i32 %0, 256
br i1 %2, label %3, label %8
3: ; preds = %1
%4 = sext i32 %0 to i64
%5 = getelementptr inbounds [256 x i8], [256 x i8]* @unicode_tolower.basic_latin, i64 0, i64 %4
%6 = load i8, i8* %5
%7 = zext i8 %6 to i32
br label %37
8: ; preds = %1
switch i32 %0, label %10 [
i32 304, label %37
i32 376, label %9
]
9: ; preds = %8
br label %37
10: ; preds = %8
%11 = icmp ult i32 %0, 384
br i1 %11, label %12, label %19
12: ; preds = %10
%13 = add nsw i32 %0, -256
%14 = zext i32 %13 to i64
%15 = getelementptr inbounds [128 x i8], [128 x i8]* @unicode_tolower.latin_extended_a, i64 0, i64 %14
%16 = load i8, i8* %15
%17 = zext i8 %16 to i32
%18 = or i32 %17, 256
br label %37
19: ; preds = %10
%20 = add nsw i32 %0, -896
%21 = icmp ult i32 %20, 80
br i1 %21, label %22, label %28
22: ; preds = %19
%23 = zext i32 %20 to i64
%24 = getelementptr inbounds [80 x i8], [80 x i8]* @unicode_tolower.greek, i64 0, i64 %23
%25 = load i8, i8* %24
%26 = zext i8 %25 to i32
%27 = or i32 %26, 768
br label %37
28: ; preds = %19
%29 = add nsw i32 %0, -1024
%30 = icmp ult i32 %29, 96
br i1 %30, label %31, label %37
31: ; preds = %28
%32 = zext i32 %29 to i64
%33 = getelementptr inbounds [96 x i8], [96 x i8]* @unicode_tolower.cyrillic, i64 0, i64 %32
%34 = load i8, i8* %33
%35 = zext i8 %34 to i32
%36 = or i32 %35, 1024
br label %37
37: ; preds = %8, %12, %28, %31, %22, %9, %3
%38 = phi i32 [ %7, %3 ], [ 255, %9 ], [ %18, %12 ], [ %27, %22 ], [ %36, %31 ], [ %0, %28 ], [ 105, %8 ]
ret i32 %38
}