int FS460_decode_bitmap_from_alpha_mask(unsigned char *p_alpha_values,
                                        long *p_alpha_value_size,
                                        const unsigned short *p_alpha_mask,
                                        int mask_size) {
  long alpha_value_size;
  unsigned char *p_a;
  const unsigned short *p_m;
  unsigned char alpha;
  int count, remainder, i;
  if ((mask_size > 0x10000) || (mask_size < 2) || !p_alpha_mask ||
      !p_alpha_values || !p_alpha_value_size)
    return 0x1000;
  alpha_value_size = *p_alpha_value_size;
  p_a = p_alpha_values;
  p_m = p_alpha_mask;
  remainder = 720;
  while (mask_size && alpha_value_size) {
    count = (*p_m) >> 8;
    alpha = (unsigned char)(0xFF & *p_m);
    p_m++;
    mask_size -= 2;
    if (!count)
      count = remainder;
    if (count > alpha_value_size)
      count = alpha_value_size;
    if (count > remainder)
      count = remainder;
    for (i = count; i > 0; i--)
      *(p_a++) = alpha;
    alpha_value_size -= count;
    remainder -= count;
    if (!remainder)
      remainder = 720;
  }
  *p_alpha_value_size -= alpha_value_size;
  return 0;
}


x86 assembly (clang, -O0):
<FS460_decode_bitmap_from_alpha_mask>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
cmpl   $0x10000,-0x24(%rbp)
jg     114b <FS460_decode_bitmap_from_alpha_mask+0x4b>
cmpl   $0x2,-0x24(%rbp)
jl     114b <FS460_decode_bitmap_from_alpha_mask+0x4b>
cmpq   $0x0,-0x20(%rbp)
je     114b <FS460_decode_bitmap_from_alpha_mask+0x4b>
cmpq   $0x0,-0x10(%rbp)
je     114b <FS460_decode_bitmap_from_alpha_mask+0x4b>
cmpq   $0x0,-0x18(%rbp)
jne    1157 <FS460_decode_bitmap_from_alpha_mask+0x57>
movl   $0x1000,-0x4(%rbp)
jmp    1285 <FS460_decode_bitmap_from_alpha_mask+0x185>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x40(%rbp)
movl   $0x2d0,-0x4c(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x24(%rbp)
mov    %al,-0x51(%rbp)
je     1193 <FS460_decode_bitmap_from_alpha_mask+0x93>
cmpq   $0x0,-0x30(%rbp)
setne  %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    11a3 <FS460_decode_bitmap_from_alpha_mask+0xa3>
jmp    126d <FS460_decode_bitmap_from_alpha_mask+0x16d>
mov    -0x40(%rbp),%rax
movzwl (%rax),%eax
sar    $0x8,%eax
mov    %eax,-0x48(%rbp)
mov    -0x40(%rbp),%rax
movzwl (%rax),%eax
and    $0xff,%eax
mov    %al,-0x41(%rbp)
mov    -0x40(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x40(%rbp)
mov    -0x24(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x48(%rbp)
jne    11e4 <FS460_decode_bitmap_from_alpha_mask+0xe4>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x48(%rbp)
movslq -0x48(%rbp),%rax
cmp    -0x30(%rbp),%rax
jle    11f9 <FS460_decode_bitmap_from_alpha_mask+0xf9>
mov    -0x30(%rbp),%rax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jle    120b <FS460_decode_bitmap_from_alpha_mask+0x10b>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    %eax,-0x50(%rbp)
cmpl   $0x0,-0x50(%rbp)
jle    123d <FS460_decode_bitmap_from_alpha_mask+0x13d>
mov    -0x41(%rbp),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x50(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x50(%rbp)
jmp    1211 <FS460_decode_bitmap_from_alpha_mask+0x111>
movslq -0x48(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x48(%rbp),%ecx
mov    -0x4c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jne    1268 <FS460_decode_bitmap_from_alpha_mask+0x168>
movl   $0x2d0,-0x4c(%rbp)
jmp    1179 <FS460_decode_bitmap_from_alpha_mask+0x79>
mov    -0x30(%rbp),%rdx
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
sub    %rdx,%rcx
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<FS460_decode_bitmap_from_alpha_mask>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rdx,0x8(%rsp)
mov    $0x1000,%eax
test   %rsi,%rsi
je     11fd <FS460_decode_bitmap_from_alpha_mask+0xed>
mov    %rdi,%r13
test   %rdi,%rdi
je     11fd <FS460_decode_bitmap_from_alpha_mask+0xed>
cmpq   $0x0,0x8(%rsp)
je     11fd <FS460_decode_bitmap_from_alpha_mask+0xed>
mov    %ecx,%r12d
add    $0xfffffffe,%r12d
cmp    $0xfffe,%r12d
ja     11fd <FS460_decode_bitmap_from_alpha_mask+0xed>
mov    (%rsi),%rbx
test   %rbx,%rbx
je     11f2 <FS460_decode_bitmap_from_alpha_mask+0xe2>
mov    %rsi,0x10(%rsp)
mov    $0x2d0,%r14d
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
mov    0x8(%rsp),%rax
movzwl (%rax,%rbp,1),%esi
mov    %esi,%eax
shr    $0x8,%eax
cmp    $0x100,%esi
cmovb  %r14d,%eax
movslq %eax,%r15
cmp    %r15,%rbx
cmovl  %ebx,%r15d
cmp    %r14d,%r15d
cmovg  %r14d,%r15d
test   %r15d,%r15d
jle    11c4 <FS460_decode_bitmap_from_alpha_mask+0xb4>
mov    %r15d,%edx
mov    %r13,%rdi
call   1030 <memset@plt>
lea    -0x1(%r15),%eax
add    %rax,%r13
add    $0x1,%r13
mov    $0x2d0,%eax
sub    %r15d,%r14d
je     11d1 <FS460_decode_bitmap_from_alpha_mask+0xc1>
mov    %r14d,%eax
movslq %r15d,%rcx
sub    %rcx,%rbx
cmp    %ebp,%r12d
je     11e8 <FS460_decode_bitmap_from_alpha_mask+0xd8>
add    $0x2,%rbp
mov    %eax,%r14d
test   %rbx,%rbx
jne    1180 <FS460_decode_bitmap_from_alpha_mask+0x70>
mov    0x10(%rsp),%rsi
mov    (%rsi),%rax
jmp    11f5 <FS460_decode_bitmap_from_alpha_mask+0xe5>
mov    %rbx,%rax
sub    %rbx,%rax
mov    %rax,(%rsi)
xor    %eax,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @FS460_decode_bitmap_from_alpha_mask(i8* %0, i64* %1, i16* %2, i32 %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i64*
%8 = alloca i16*
%9 = alloca i32
%10 = alloca i64
%11 = alloca i8*
%12 = alloca i16*
%13 = alloca i8
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
store i8* %0, i8** %6
store i64* %1, i64** %7
store i16* %2, i16** %8
store i32 %3, i32* %9
%17 = load i32, i32* %9
%18 = icmp sgt i32 %17, 65536
br i1 %18, label %31, label %19
19: ; preds = %4
%20 = load i32, i32* %9
%21 = icmp slt i32 %20, 2
br i1 %21, label %31, label %22
22: ; preds = %19
%23 = load i16*, i16** %8
%24 = icmp ne i16* %23, null
br i1 %24, label %25, label %31
25: ; preds = %22
%26 = load i8*, i8** %6
%27 = icmp ne i8* %26, null
br i1 %27, label %28, label %31
28: ; preds = %25
%29 = load i64*, i64** %7
%30 = icmp ne i64* %29, null
br i1 %30, label %32, label %31
31: ; preds = %28, %25, %22, %19, %4
store i32 4096, i32* %5
br label %106
32: ; preds = %28
%33 = load i64*, i64** %7
%34 = load i64, i64* %33
store i64 %34, i64* %10
%35 = load i8*, i8** %6
store i8* %35, i8** %11
%36 = load i16*, i16** %8
store i16* %36, i16** %12
store i32 720, i32* %15
br label %37
37: ; preds = %100, %32
%38 = load i32, i32* %9
%39 = icmp ne i32 %38, 0
br i1 %39, label %40, label %43
40: ; preds = %37
%41 = load i64, i64* %10
%42 = icmp ne i64 %41, 0
br label %43
43: ; preds = %40, %37
%44 = phi i1 [ false, %37 ], [ %42, %40 ]
br i1 %44, label %45, label %101
45: ; preds = %43
%46 = load i16*, i16** %12
%47 = load i16, i16* %46
%48 = zext i16 %47 to i32
%49 = ashr i32 %48, 8
store i32 %49, i32* %14
%50 = load i16*, i16** %12
%51 = load i16, i16* %50
%52 = zext i16 %51 to i32
%53 = and i32 255, %52
%54 = trunc i32 %53 to i8
store i8 %54, i8* %13
%55 = load i16*, i16** %12
%56 = getelementptr inbounds i16, i16* %55, i32 1
store i16* %56, i16** %12
%57 = load i32, i32* %9
%58 = sub nsw i32 %57, 2
store i32 %58, i32* %9
%59 = load i32, i32* %14
%60 = icmp ne i32 %59, 0
br i1 %60, label %63, label %61
61: ; preds = %45
%62 = load i32, i32* %15
store i32 %62, i32* %14
br label %63
63: ; preds = %61, %45
%64 = load i32, i32* %14
%65 = sext i32 %64 to i64
%66 = load i64, i64* %10
%67 = icmp sgt i64 %65, %66
br i1 %67, label %68, label %71
68: ; preds = %63
%69 = load i64, i64* %10
%70 = trunc i64 %69 to i32
store i32 %70, i32* %14
br label %71
71: ; preds = %68, %63
%72 = load i32, i32* %14
%73 = load i32, i32* %15
%74 = icmp sgt i32 %72, %73
br i1 %74, label %75, label %77
75: ; preds = %71
%76 = load i32, i32* %15
store i32 %76, i32* %14
br label %77
77: ; preds = %75, %71
%78 = load i32, i32* %14
store i32 %78, i32* %16
br label %79
79: ; preds = %86, %77
%80 = load i32, i32* %16
%81 = icmp sgt i32 %80, 0
br i1 %81, label %82, label %89
82: ; preds = %79
%83 = load i8, i8* %13
%84 = load i8*, i8** %11
%85 = getelementptr inbounds i8, i8* %84, i32 1
store i8* %85, i8** %11
store i8 %83, i8* %84
br label %86
86: ; preds = %82
%87 = load i32, i32* %16
%88 = add nsw i32 %87, -1
store i32 %88, i32* %16
br label %79
89: ; preds = %79
%90 = load i32, i32* %14
%91 = sext i32 %90 to i64
%92 = load i64, i64* %10
%93 = sub nsw i64 %92, %91
store i64 %93, i64* %10
%94 = load i32, i32* %14
%95 = load i32, i32* %15
%96 = sub nsw i32 %95, %94
store i32 %96, i32* %15
%97 = load i32, i32* %15
%98 = icmp ne i32 %97, 0
br i1 %98, label %100, label %99
99: ; preds = %89
store i32 720, i32* %15
br label %100
100: ; preds = %99, %89
br label %37
101: ; preds = %43
%102 = load i64, i64* %10
%103 = load i64*, i64** %7
%104 = load i64, i64* %103
%105 = sub nsw i64 %104, %102
store i64 %105, i64* %103
store i32 0, i32* %5
br label %106
106: ; preds = %101, %31
%107 = load i32, i32* %5
ret i32 %107
}

LLVM IR (-O2):
define i32 @FS460_decode_bitmap_from_alpha_mask(i8* writeonly %0, i64* %1, i16* %2, i32 %3) {
%5 = add i32 %3, -2
%6 = icmp ult i32 %5, 65535
%7 = icmp ne i16* %2, null
%8 = and i1 %7, %6
%9 = icmp ne i8* %0, null
%10 = and i1 %9, %8
%11 = icmp ne i64* %1, null
%12 = and i1 %11, %10
br i1 %12, label %13, label %59
13: ; preds = %4
%14 = load i64, i64* %1
%15 = icmp eq i64 %14, 0
br i1 %15, label %55, label %16
16: ; preds = %13, %43
%17 = phi i32 [ %49, %43 ], [ 720, %13 ]
%18 = phi i16* [ %25, %43 ], [ %2, %13 ]
%19 = phi i8* [ %44, %43 ], [ %0, %13 ]
%20 = phi i64 [ %46, %43 ], [ %14, %13 ]
%21 = phi i32 [ %26, %43 ], [ %3, %13 ]
%22 = load i16, i16* %18
%23 = lshr i16 %22, 8
%24 = zext i16 %23 to i32
%25 = getelementptr inbounds i16, i16* %18, i64 1
%26 = add nsw i32 %21, -2
%27 = icmp ult i16 %22, 256
%28 = select i1 %27, i32 %17, i32 %24
%29 = sext i32 %28 to i64
%30 = icmp slt i64 %20, %29
%31 = trunc i64 %20 to i32
%32 = select i1 %30, i32 %31, i32 %28
%33 = icmp sgt i32 %32, %17
%34 = select i1 %33, i32 %17, i32 %32
%35 = icmp sgt i32 %34, 0
br i1 %35, label %36, label %43
36: ; preds = %16
%37 = trunc i16 %22 to i8
%38 = zext i32 %34 to i64
%39 = add nsw i32 %34, -1
%40 = zext i32 %39 to i64
%41 = getelementptr i8, i8* %19, i64 1
%42 = getelementptr i8, i8* %41, i64 %40
br label %43
43: ; preds = %36, %16
%44 = phi i8* [ %19, %16 ], [ %42, %36 ]
%45 = sext i32 %34 to i64
%46 = sub nsw i64 %20, %45
%47 = sub nsw i32 %17, %34
%48 = icmp eq i32 %47, 0
%49 = select i1 %48, i32 720, i32 %47
%50 = icmp ne i32 %26, 0
%51 = icmp ne i64 %46, 0
%52 = select i1 %50, i1 %51, i1 false
br i1 %52, label %16, label %53
53: ; preds = %43
%54 = load i64, i64* %1
br label %55
55: ; preds = %53, %13
%56 = phi i64 [ %14, %13 ], [ %54, %53 ]
%57 = phi i64 [ %14, %13 ], [ %46, %53 ]
%58 = sub nsw i64 %56, %57
store i64 %58, i64* %1
br label %59
59: ; preds = %4, %55
%60 = phi i32 [ 0, %55 ], [ 4096, %4 ]
ret i32 %60
}