unsigned short XUtf8IsRightToLeft(unsigned int ucs) {
  if (ucs <= 0x05F4) {
    if (ucs >= 0x0591)
      return 1;
    return 0;
  }
  if (ucs <= 0x06ED) {
    if (ucs >= 0x060C)
      return 1;
    return 0;
  }
  if (ucs <= 0x06F9) {
    if (ucs >= 0x06F0)
      return 1;
    return 0;
  }
  if (ucs == 0x200F)
    return 1;
  if (ucs == 0x202B)
    return 1;
  if (ucs == 0x202E)
    return 1;
  if (ucs <= 0xFB4F) {
    if (ucs >= 0xFB1E)
      return 1;
    return 0;
  }
  if (ucs <= 0xFDFB) {
    if (ucs >= 0xFB50)
      return 1;
    return 0;
  }
  if (ucs <= 0xFEFC) {
    if (ucs >= 0xFE70)
      return 1;
    return 0;
  }
  return 0;
}


x86 assembly (clang, -O0):
<XUtf8IsRightToLeft>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x5f4,-0x8(%rbp)
ja     1137 <XUtf8IsRightToLeft+0x37>
cmpl   $0x591,-0x8(%rbp)
jb     112c <XUtf8IsRightToLeft+0x2c>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
movw   $0x0,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
cmpl   $0x6ed,-0x8(%rbp)
ja     1167 <XUtf8IsRightToLeft+0x67>
cmpl   $0x60c,-0x8(%rbp)
jb     115c <XUtf8IsRightToLeft+0x5c>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
movw   $0x0,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
cmpl   $0x6f9,-0x8(%rbp)
ja     1197 <XUtf8IsRightToLeft+0x97>
cmpl   $0x6f0,-0x8(%rbp)
jb     118c <XUtf8IsRightToLeft+0x8c>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
movw   $0x0,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
cmpl   $0x200f,-0x8(%rbp)
jne    11af <XUtf8IsRightToLeft+0xaf>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
cmpl   $0x202b,-0x8(%rbp)
jne    11c7 <XUtf8IsRightToLeft+0xc7>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
cmpl   $0x202e,-0x8(%rbp)
jne    11df <XUtf8IsRightToLeft+0xdf>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
cmpl   $0xfb4f,-0x8(%rbp)
ja     120f <XUtf8IsRightToLeft+0x10f>
cmpl   $0xfb1e,-0x8(%rbp)
jb     1204 <XUtf8IsRightToLeft+0x104>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
movw   $0x0,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
cmpl   $0xfdfb,-0x8(%rbp)
ja     123f <XUtf8IsRightToLeft+0x13f>
cmpl   $0xfb50,-0x8(%rbp)
jb     1234 <XUtf8IsRightToLeft+0x134>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
movw   $0x0,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
cmpl   $0xfefc,-0x8(%rbp)
ja     126f <XUtf8IsRightToLeft+0x16f>
cmpl   $0xfe70,-0x8(%rbp)
jb     1264 <XUtf8IsRightToLeft+0x164>
movw   $0x1,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
movw   $0x0,-0x2(%rbp)
jmp    1275 <XUtf8IsRightToLeft+0x175>
movw   $0x0,-0x2(%rbp)
movzwl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<XUtf8IsRightToLeft>:
cmp    $0x5f4,%edi
ja     1110 <XUtf8IsRightToLeft+0x10>
cmp    $0x591,%edi
jmp    112e <XUtf8IsRightToLeft+0x2e>
cmp    $0x6ed,%edi
ja     1120 <XUtf8IsRightToLeft+0x20>
cmp    $0x60c,%edi
jmp    112e <XUtf8IsRightToLeft+0x2e>
cmp    $0x6f9,%edi
ja     1135 <XUtf8IsRightToLeft+0x35>
cmp    $0x6f0,%edi
setae  %al
movzbl %al,%eax
ret
mov    $0x1,%al
lea    -0x200f(%rdi),%ecx
cmp    $0x1f,%ecx
ja     114c <XUtf8IsRightToLeft+0x4c>
mov    $0x90000001,%edx
bt     %ecx,%edx
jb     1131 <XUtf8IsRightToLeft+0x31>
cmp    $0xfb4f,%edi
ja     115c <XUtf8IsRightToLeft+0x5c>
cmp    $0xfb1e,%edi
jmp    112e <XUtf8IsRightToLeft+0x2e>
cmp    $0xfdfc,%edi
jb     1131 <XUtf8IsRightToLeft+0x31>
add    $0xffff0190,%edi
cmp    $0x8d,%edi
setb   %al
movzbl %al,%eax
ret

LLVM IR (-O0):
define zeroext i16 @XUtf8IsRightToLeft(i32 %0) {
%2 = alloca i16
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp ule i32 %4, 1524
br i1 %5, label %6, label %11
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp uge i32 %7, 1425
br i1 %8, label %9, label %10
9: ; preds = %6
store i16 1, i16* %2
br label %64
10: ; preds = %6
store i16 0, i16* %2
br label %64
11: ; preds = %1
%12 = load i32, i32* %3
%13 = icmp ule i32 %12, 1773
br i1 %13, label %14, label %19
14: ; preds = %11
%15 = load i32, i32* %3
%16 = icmp uge i32 %15, 1548
br i1 %16, label %17, label %18
17: ; preds = %14
store i16 1, i16* %2
br label %64
18: ; preds = %14
store i16 0, i16* %2
br label %64
19: ; preds = %11
%20 = load i32, i32* %3
%21 = icmp ule i32 %20, 1785
br i1 %21, label %22, label %27
22: ; preds = %19
%23 = load i32, i32* %3
%24 = icmp uge i32 %23, 1776
br i1 %24, label %25, label %26
25: ; preds = %22
store i16 1, i16* %2
br label %64
26: ; preds = %22
store i16 0, i16* %2
br label %64
27: ; preds = %19
%28 = load i32, i32* %3
%29 = icmp eq i32 %28, 8207
br i1 %29, label %30, label %31
30: ; preds = %27
store i16 1, i16* %2
br label %64
31: ; preds = %27
%32 = load i32, i32* %3
%33 = icmp eq i32 %32, 8235
br i1 %33, label %34, label %35
34: ; preds = %31
store i16 1, i16* %2
br label %64
35: ; preds = %31
%36 = load i32, i32* %3
%37 = icmp eq i32 %36, 8238
br i1 %37, label %38, label %39
38: ; preds = %35
store i16 1, i16* %2
br label %64
39: ; preds = %35
%40 = load i32, i32* %3
%41 = icmp ule i32 %40, 64335
br i1 %41, label %42, label %47
42: ; preds = %39
%43 = load i32, i32* %3
%44 = icmp uge i32 %43, 64286
br i1 %44, label %45, label %46
45: ; preds = %42
store i16 1, i16* %2
br label %64
46: ; preds = %42
store i16 0, i16* %2
br label %64
47: ; preds = %39
%48 = load i32, i32* %3
%49 = icmp ule i32 %48, 65019
br i1 %49, label %50, label %55
50: ; preds = %47
%51 = load i32, i32* %3
%52 = icmp uge i32 %51, 64336
br i1 %52, label %53, label %54
53: ; preds = %50
store i16 1, i16* %2
br label %64
54: ; preds = %50
store i16 0, i16* %2
br label %64
55: ; preds = %47
%56 = load i32, i32* %3
%57 = icmp ule i32 %56, 65276
br i1 %57, label %58, label %63
58: ; preds = %55
%59 = load i32, i32* %3
%60 = icmp uge i32 %59, 65136
br i1 %60, label %61, label %62
61: ; preds = %58
store i16 1, i16* %2
br label %64
62: ; preds = %58
store i16 0, i16* %2
br label %64
63: ; preds = %55
store i16 0, i16* %2
br label %64
64: ; preds = %63, %62, %61, %54, %53, %46, %45, %38, %34, %30, %26, %25, %18, %17, %10, %9
%65 = load i16, i16* %2
ret i16 %65
}

LLVM IR (-O2):
define zeroext i16 @XUtf8IsRightToLeft(i32 %0) {
%2 = icmp ult i32 %0, 1525
br i1 %2, label %3, label %5
3: ; preds = %1
%4 = icmp ugt i32 %0, 1424
br label %23
5: ; preds = %1
%6 = icmp ult i32 %0, 1774
br i1 %6, label %7, label %9
7: ; preds = %5
%8 = icmp ugt i32 %0, 1547
br label %23
9: ; preds = %5
%10 = icmp ult i32 %0, 1786
br i1 %10, label %11, label %13
11: ; preds = %9
%12 = icmp ugt i32 %0, 1775
br label %23
13: ; preds = %9
switch i32 %0, label %14 [
i32 8207, label %23
i32 8235, label %23
i32 8238, label %23
]
14: ; preds = %13
%15 = icmp ult i32 %0, 64336
br i1 %15, label %16, label %18
16: ; preds = %14
%17 = icmp ugt i32 %0, 64285
br label %23
18: ; preds = %14
%19 = icmp ult i32 %0, 65020
br i1 %19, label %23, label %20
20: ; preds = %18
%21 = add i32 %0, -65136
%22 = icmp ult i32 %21, 141
br label %23
23: ; preds = %20, %18, %16, %13, %13, %13, %11, %7, %3
%24 = phi i1 [ %4, %3 ], [ %8, %7 ], [ %12, %11 ], [ true, %13 ], [ true, %13 ], [ true, %13 ], [ %17, %16 ], [ true, %18 ], [ %22, %20 ]
%25 = zext i1 %24 to i16
ret i16 %25
}