int u16_uctomb_aux(unsigned short *s, unsigned int uc, int n) {
  if (uc >= 0x10000) {
    if (uc < 0x110000) {
      if (n >= 2) {
        s[0] = 0xd800 + ((uc - 0x10000) >> 10);
        s[1] = 0xdc00 + ((uc - 0x10000) & 0x3ff);
        return 2;
      }
    } else
      return -1;
  }
  return -2;
}


x86 assembly (clang, -O0):
<u16_uctomb_aux>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
cmpl   $0x10000,-0x14(%rbp)
jb     118b <u16_uctomb_aux+0x8b>
cmpl   $0x110000,-0x14(%rbp)
jae    117a <u16_uctomb_aux+0x7a>
cmpl   $0x2,-0x18(%rbp)
jl     1175 <u16_uctomb_aux+0x75>
mov    -0x14(%rbp),%eax
sub    $0x10000,%eax
shr    $0xa,%eax
add    $0xd800,%eax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %cx,(%rax)
mov    -0x14(%rbp),%eax
sub    $0x10000,%eax
and    $0x3ff,%eax
add    $0xdc00,%eax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %cx,0x2(%rax)
movl   $0x2,-0x4(%rbp)
jmp    1192 <u16_uctomb_aux+0x92>
jmp    1186 <u16_uctomb_aux+0x86>
movl   $0xffffffff,-0x4(%rbp)
jmp    1192 <u16_uctomb_aux+0x92>
jmp    118b <u16_uctomb_aux+0x8b>
movl   $0xfffffffe,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<u16_uctomb_aux>:
mov    $0xfffffffe,%eax
cmp    $0x10000,%esi
jb     114a <u16_uctomb_aux+0x4a>
mov    $0xffffffff,%eax
cmp    $0x10ffff,%esi
ja     114a <u16_uctomb_aux+0x4a>
mov    $0xfffffffe,%eax
cmp    $0x2,%edx
jl     114a <u16_uctomb_aux+0x4a>
lea    0x3ff0000(%rsi),%eax
shr    $0xa,%eax
add    $0xffffd800,%eax
mov    %ax,(%rdi)
and    $0x3ff,%esi
or     $0xdc00,%esi
mov    %si,0x2(%rdi)
mov    $0x2,%eax
ret

LLVM IR (-O0):
define i32 @u16_uctomb_aux(i16* %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i16*
%6 = alloca i32
%7 = alloca i32
store i16* %0, i16** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%8 = load i32, i32* %6
%9 = icmp uge i32 %8, 65536
br i1 %9, label %10, label %34
10: ; preds = %3
%11 = load i32, i32* %6
%12 = icmp ult i32 %11, 1114112
br i1 %12, label %13, label %32
13: ; preds = %10
%14 = load i32, i32* %7
%15 = icmp sge i32 %14, 2
br i1 %15, label %16, label %31
16: ; preds = %13
%17 = load i32, i32* %6
%18 = sub i32 %17, 65536
%19 = lshr i32 %18, 10
%20 = add i32 55296, %19
%21 = trunc i32 %20 to i16
%22 = load i16*, i16** %5
%23 = getelementptr inbounds i16, i16* %22, i64 0
store i16 %21, i16* %23
%24 = load i32, i32* %6
%25 = sub i32 %24, 65536
%26 = and i32 %25, 1023
%27 = add i32 56320, %26
%28 = trunc i32 %27 to i16
%29 = load i16*, i16** %5
%30 = getelementptr inbounds i16, i16* %29, i64 1
store i16 %28, i16* %30
store i32 2, i32* %4
br label %35
31: ; preds = %13
br label %33
32: ; preds = %10
store i32 -1, i32* %4
br label %35
33: ; preds = %31
br label %34
34: ; preds = %33, %3
store i32 -2, i32* %4
br label %35
35: ; preds = %34, %32, %16
%36 = load i32, i32* %4
ret i32 %36
}

LLVM IR (-O2):
define i32 @u16_uctomb_aux(i16* nocapture writeonly %0, i32 %1, i32 %2) {
%4 = icmp ugt i32 %1, 65535
br i1 %4, label %5, label %18
5: ; preds = %3
%6 = icmp ult i32 %1, 1114112
br i1 %6, label %7, label %18
7: ; preds = %5
%8 = icmp sgt i32 %2, 1
br i1 %8, label %9, label %18
9: ; preds = %7
%10 = add nuw nsw i32 %1, 67043328
%11 = lshr i32 %10, 10
%12 = trunc i32 %11 to i16
%13 = add nuw nsw i16 %12, -10240
store i16 %13, i16* %0
%14 = trunc i32 %1 to i16
%15 = and i16 %14, 1023
%16 = or i16 %15, -9216
%17 = getelementptr inbounds i16, i16* %0, i64 1
store i16 %16, i16* %17
br label %18
18: ; preds = %3, %7, %5, %9
%19 = phi i32 [ 2, %9 ], [ -1, %5 ], [ -2, %7 ], [ -2, %3 ]
ret i32 %19
}