int xmlIsChar(unsigned int ch) {
  return ((((ch) < 0x100) ? (((0x9 <= ((ch))) && (((ch)) <= 0xa)) ||
                             (((ch)) == 0xd) || (0x20 <= ((ch))))
                          : (((0x100 <= (ch)) && ((ch) <= 0xd7ff)) ||
                             ((0xe000 <= (ch)) && ((ch) <= 0xfffd)) ||
                             ((0x10000 <= (ch)) && ((ch) <= 0x10ffff)))));
}


x86 assembly (clang, -O0):
<xmlIsChar>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
cmpl   $0x100,-0x4(%rbp)
jae    115e <xmlIsChar+0x5e>
mov    $0x9,%eax
cmp    -0x4(%rbp),%eax
ja     1131 <xmlIsChar+0x31>
mov    $0x1,%al
cmpl   $0xa,-0x4(%rbp)
mov    %al,-0x5(%rbp)
jbe    114e <xmlIsChar+0x4e>
mov    $0x1,%al
cmpl   $0xd,-0x4(%rbp)
mov    %al,-0x5(%rbp)
je     114e <xmlIsChar+0x4e>
mov    $0x20,%eax
cmp    -0x4(%rbp),%eax
setbe  %al
mov    %al,-0x5(%rbp)
mov    -0x5(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0xc(%rbp)
jmp    11cf <xmlIsChar+0xcf>
mov    $0x100,%eax
cmp    -0x4(%rbp),%eax
ja     117e <xmlIsChar+0x7e>
mov    $0x1,%al
cmpl   $0xd7ff,-0x4(%rbp)
mov    %al,-0xd(%rbp)
jbe    11c4 <xmlIsChar+0xc4>
mov    $0xe000,%eax
cmp    -0x4(%rbp),%eax
ja     119e <xmlIsChar+0x9e>
mov    $0x1,%al
cmpl   $0xfffd,-0x4(%rbp)
mov    %al,-0xd(%rbp)
jbe    11c4 <xmlIsChar+0xc4>
xor    %eax,%eax
mov    $0x10000,%ecx
cmp    -0x4(%rbp),%ecx
mov    %al,-0xe(%rbp)
ja     11be <xmlIsChar+0xbe>
cmpl   $0x10ffff,-0x4(%rbp)
setbe  %al
mov    %al,-0xe(%rbp)
mov    -0xe(%rbp),%al
mov    %al,-0xd(%rbp)
mov    -0xd(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<xmlIsChar>:
cmp    $0xff,%edi
ja     111d <xmlIsChar+0x1d>
cmp    $0xd,%edi
ja     114c <xmlIsChar+0x4c>
mov    $0x1,%al
mov    $0x2600,%ecx
bt     %edi,%ecx
jae    114c <xmlIsChar+0x4c>
movzbl %al,%eax
ret
cmp    $0xd800,%edi
setb   %al
lea    -0xe000(%rdi),%ecx
cmp    $0x1ffe,%ecx
setb   %cl
or     %al,%cl
add    $0xffff0000,%edi
cmp    $0x100000,%edi
setb   %al
or     %cl,%al
movzbl %al,%eax
ret
cmp    $0x20,%edi
setae  %al
movzbl %al,%eax
ret

LLVM IR (-O0):
define i32 @xmlIsChar(i32 %0) {
%2 = alloca i32
store i32 %0, i32* %2
%3 = load i32, i32* %2
%4 = icmp ult i32 %3, 256
br i1 %4, label %5, label %20
5: ; preds = %1
%6 = load i32, i32* %2
%7 = icmp ule i32 9, %6
br i1 %7, label %8, label %11
8: ; preds = %5
%9 = load i32, i32* %2
%10 = icmp ule i32 %9, 10
br i1 %10, label %17, label %11
11: ; preds = %8, %5
%12 = load i32, i32* %2
%13 = icmp eq i32 %12, 13
br i1 %13, label %17, label %14
14: ; preds = %11
%15 = load i32, i32* %2
%16 = icmp ule i32 32, %15
br label %17
17: ; preds = %14, %11, %8
%18 = phi i1 [ true, %11 ], [ true, %8 ], [ %16, %14 ]
%19 = zext i1 %18 to i32
br label %43
20: ; preds = %1
%21 = load i32, i32* %2
%22 = icmp ule i32 256, %21
br i1 %22, label %23, label %26
23: ; preds = %20
%24 = load i32, i32* %2
%25 = icmp ule i32 %24, 55295
br i1 %25, label %40, label %26
26: ; preds = %23, %20
%27 = load i32, i32* %2
%28 = icmp ule i32 57344, %27
br i1 %28, label %29, label %32
29: ; preds = %26
%30 = load i32, i32* %2
%31 = icmp ule i32 %30, 65533
br i1 %31, label %40, label %32
32: ; preds = %29, %26
%33 = load i32, i32* %2
%34 = icmp ule i32 65536, %33
br i1 %34, label %35, label %38
35: ; preds = %32
%36 = load i32, i32* %2
%37 = icmp ule i32 %36, 1114111
br label %38
38: ; preds = %35, %32
%39 = phi i1 [ false, %32 ], [ %37, %35 ]
br label %40
40: ; preds = %38, %29, %23
%41 = phi i1 [ true, %29 ], [ true, %23 ], [ %39, %38 ]
%42 = zext i1 %41 to i32
br label %43
43: ; preds = %40, %17
%44 = phi i32 [ %19, %17 ], [ %42, %40 ]
ret i32 %44
}

LLVM IR (-O2):
define i32 @xmlIsChar(i32 %0) {
%2 = icmp ult i32 %0, 256
br i1 %2, label %3, label %6
3: ; preds = %1
switch i32 %0, label %4 [
i32 13, label %14
i32 10, label %14
i32 9, label %14
]
4: ; preds = %3
%5 = icmp ugt i32 %0, 31
br label %14
6: ; preds = %1
%7 = icmp ult i32 %0, 55296
%8 = add i32 %0, -57344
%9 = icmp ult i32 %8, 8190
%10 = or i1 %7, %9
%11 = add i32 %0, -65536
%12 = icmp ult i32 %11, 1048576
%13 = or i1 %12, %10
br label %14
14: ; preds = %4, %3, %3, %3, %6
%15 = phi i1 [ %13, %6 ], [ %5, %4 ], [ true, %3 ], [ true, %3 ], [ true, %3 ]
%16 = zext i1 %15 to i32
ret i32 %16
}