#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 uint32_t;
typedef int uint16_t;
typedef int int32_t;

/* Variables and functions */
void halfp2singles(uint32_t *xp, const uint16_t *hp, int numel) {
  uint16_t h, hs, he, hm;
  uint32_t xs, xe, xm;
  int32_t xes;
  int e;
  if (xp == NULL || hp == NULL)
    return;
  while (numel--) {
    h = *hp++;
    if ((h & 0x7FFFu) == 0) {
      *xp++ = ((uint32_t)h) << 16;
    } else {
      hs = h & 0x8000u;
      he = h & 0x7C00u;
      hm = h & 0x03FFu;
      if (he == 0) {
        e = -1;
        do {
          e++;
          hm <<= 1;
        } while ((hm & 0x0400u) == 0);
        xs = ((uint32_t)hs) << 16;
        xes = ((int32_t)(he >> 10)) - 15 + 127 - e;
        xe = (uint32_t)(xes << 23);
        xm = ((uint32_t)(hm & 0x03FFu)) << 13;
        *xp++ = (xs | xe | xm);
      } else if (he == 0x7C00u) {
        if (hm == 0) {
          *xp++ = (((uint32_t)hs) << 16) | ((uint32_t)0x7F800000u);
        } else {
          *xp++ = (uint32_t)0xFFC00000u;
        }
      } else {
        xs = ((uint32_t)hs) << 16;
        xes = ((int32_t)(he >> 10)) - 15 + 127;
        xe = (uint32_t)(xes << 23);
        xm = ((uint32_t)hm) << 13;
        *xp++ = (xs | xe | xm);
      }
    }
  }
  return;
}


x86 assembly (clang, -O0):
<halfp2singles>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
cmpq   $0x0,-0x8(%rbp)
je     1125 <halfp2singles+0x25>
cmpq   $0x0,-0x10(%rbp)
jne    112a <halfp2singles+0x2a>
jmp    12d5 <halfp2singles+0x1d5>
jmp    112f <halfp2singles+0x2f>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
je     12d0 <halfp2singles+0x1d0>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
and    $0x7fff,%eax
cmp    $0x0,%eax
jne    1184 <halfp2singles+0x84>
mov    -0x18(%rbp),%ecx
shl    $0x10,%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
jmp    12cb <halfp2singles+0x1cb>
mov    -0x18(%rbp),%eax
and    $0x8000,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
and    $0x7c00,%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%eax
and    $0x3ff,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x20(%rbp)
jne    122a <halfp2singles+0x12a>
movl   $0xffffffff,-0x38(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
and    $0x400,%eax
cmp    $0x0,%eax
je     11b6 <halfp2singles+0xb6>
mov    -0x1c(%rbp),%eax
shl    $0x10,%eax
mov    %eax,-0x28(%rbp)
mov    -0x20(%rbp),%eax
sar    $0xa,%eax
sub    $0xf,%eax
add    $0x7f,%eax
sub    -0x38(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
shl    $0x17,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x24(%rbp),%eax
and    $0x3ff,%eax
shl    $0xd,%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%ecx
or     -0x2c(%rbp),%ecx
or     -0x30(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
jmp    12c6 <halfp2singles+0x1c6>
cmpl   $0x7c00,-0x20(%rbp)
jne    127d <halfp2singles+0x17d>
cmpl   $0x0,-0x24(%rbp)
jne    1263 <halfp2singles+0x163>
mov    -0x1c(%rbp),%ecx
shl    $0x10,%ecx
or     $0x7f800000,%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
jmp    1278 <halfp2singles+0x178>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x8(%rbp)
movl   $0xffc00000,(%rax)
jmp    12c1 <halfp2singles+0x1c1>
mov    -0x1c(%rbp),%eax
shl    $0x10,%eax
mov    %eax,-0x28(%rbp)
mov    -0x20(%rbp),%eax
sar    $0xa,%eax
sub    $0xf,%eax
add    $0x7f,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
shl    $0x17,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x24(%rbp),%eax
shl    $0xd,%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%ecx
or     -0x2c(%rbp),%ecx
or     -0x30(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
jmp    12c6 <halfp2singles+0x1c6>
jmp    12cb <halfp2singles+0x1cb>
jmp    112f <halfp2singles+0x2f>
jmp    12d5 <halfp2singles+0x1d5>
pop    %rbp
ret

x86 assembly (clang, -O2):
<halfp2singles>:
test   %rdi,%rdi
je     110a <halfp2singles+0xa>
test   %rsi,%rsi
jne    1121 <halfp2singles+0x21>
ret
nopl   0x0(%rax,%rax,1)
shl    $0x10,%r9d
mov    %r9d,%eax
add    $0x4,%rsi
mov    %eax,(%rdi)
add    $0x4,%rdi
test   %edx,%edx
je     110a <halfp2singles+0xa>
add    $0xffffffff,%edx
mov    (%rsi),%r9d
test   $0x7fff,%r9d
je     1110 <halfp2singles+0x10>
mov    %r9d,%r8d
and    $0x8000,%r8d
mov    %r9d,%eax
and    $0x7c00,%eax
and    $0x3ff,%r9d
cmp    $0x7c00,%eax
je     1187 <halfp2singles+0x87>
test   %eax,%eax
jne    11a4 <halfp2singles+0xa4>
mov    $0x38800000,%ecx
nopl   (%rax)
mov    %r9d,%eax
lea    (%rax,%rax,1),%r9d
add    $0xff800000,%ecx
test   $0x200,%eax
je     1160 <halfp2singles+0x60>
shl    $0x10,%r8d
shl    $0xe,%eax
and    $0x7fc000,%eax
or     %r8d,%eax
or     %ecx,%eax
jmp    1117 <halfp2singles+0x17>
mov    $0xffc00000,%eax
test   %r9d,%r9d
jne    1117 <halfp2singles+0x17>
shl    $0x10,%r8d
or     $0x7f800000,%r8d
mov    %r8d,%eax
jmp    1117 <halfp2singles+0x17>
shl    $0x10,%r8d
shl    $0xd,%eax
add    $0x38000000,%eax
shl    $0xd,%r9d
or     %r8d,%r9d
or     %eax,%r9d
jmp    1114 <halfp2singles+0x14>

LLVM IR (-O0):
define void @halfp2singles(i32* %0, i32* %1, i32 %2) {
%4 = alloca i32*
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
store i32* %0, i32** %4
store i32* %1, i32** %5
store i32 %2, i32* %6
%16 = load i32*, i32** %4
%17 = icmp eq i32* %16, null
br i1 %17, label %21, label %18
18: ; preds = %3
%19 = load i32*, i32** %5
%20 = icmp eq i32* %19, null
br i1 %20, label %21, label %22
21: ; preds = %18, %3
br label %117
22: ; preds = %18
br label %23
23: ; preds = %115, %22
%24 = load i32, i32* %6
%25 = add nsw i32 %24, -1
store i32 %25, i32* %6
%26 = icmp ne i32 %24, 0
br i1 %26, label %27, label %116
27: ; preds = %23
%28 = load i32*, i32** %5
%29 = getelementptr inbounds i32, i32* %28, i32 1
store i32* %29, i32** %5
%30 = load i32, i32* %28
store i32 %30, i32* %7
%31 = load i32, i32* %7
%32 = and i32 %31, 32767
%33 = icmp eq i32 %32, 0
br i1 %33, label %34, label %39
34: ; preds = %27
%35 = load i32, i32* %7
%36 = shl i32 %35, 16
%37 = load i32*, i32** %4
%38 = getelementptr inbounds i32, i32* %37, i32 1
store i32* %38, i32** %4
store i32 %36, i32* %37
br label %115
39: ; preds = %27
%40 = load i32, i32* %7
%41 = and i32 %40, 32768
store i32 %41, i32* %8
%42 = load i32, i32* %7
%43 = and i32 %42, 31744
store i32 %43, i32* %9
%44 = load i32, i32* %7
%45 = and i32 %44, 1023
store i32 %45, i32* %10
%46 = load i32, i32* %9
%47 = icmp eq i32 %46, 0
br i1 %47, label %48, label %79
48: ; preds = %39
store i32 -1, i32* %15
br label %49
49: ; preds = %54, %48
%50 = load i32, i32* %15
%51 = add nsw i32 %50, 1
store i32 %51, i32* %15
%52 = load i32, i32* %10
%53 = shl i32 %52, 1
store i32 %53, i32* %10
br label %54
54: ; preds = %49
%55 = load i32, i32* %10
%56 = and i32 %55, 1024
%57 = icmp eq i32 %56, 0
br i1 %57, label %49, label %58
58: ; preds = %54
%59 = load i32, i32* %8
%60 = shl i32 %59, 16
store i32 %60, i32* %11
%61 = load i32, i32* %9
%62 = ashr i32 %61, 10
%63 = sub nsw i32 %62, 15
%64 = add nsw i32 %63, 127
%65 = load i32, i32* %15
%66 = sub nsw i32 %64, %65
store i32 %66, i32* %14
%67 = load i32, i32* %14
%68 = shl i32 %67, 23
store i32 %68, i32* %12
%69 = load i32, i32* %10
%70 = and i32 %69, 1023
%71 = shl i32 %70, 13
store i32 %71, i32* %13
%72 = load i32, i32* %11
%73 = load i32, i32* %12
%74 = or i32 %72, %73
%75 = load i32, i32* %13
%76 = or i32 %74, %75
%77 = load i32*, i32** %4
%78 = getelementptr inbounds i32, i32* %77, i32 1
store i32* %78, i32** %4
store i32 %76, i32* %77
br label %114
79: ; preds = %39
%80 = load i32, i32* %9
%81 = icmp eq i32 %80, 31744
br i1 %81, label %82, label %95
82: ; preds = %79
%83 = load i32, i32* %10
%84 = icmp eq i32 %83, 0
br i1 %84, label %85, label %91
85: ; preds = %82
%86 = load i32, i32* %8
%87 = shl i32 %86, 16
%88 = or i32 %87, 2139095040
%89 = load i32*, i32** %4
%90 = getelementptr inbounds i32, i32* %89, i32 1
store i32* %90, i32** %4
store i32 %88, i32* %89
br label %94
91: ; preds = %82
%92 = load i32*, i32** %4
%93 = getelementptr inbounds i32, i32* %92, i32 1
store i32* %93, i32** %4
store i32 -4194304, i32* %92
br label %94
94: ; preds = %91, %85
br label %113
95: ; preds = %79
%96 = load i32, i32* %8
%97 = shl i32 %96, 16
store i32 %97, i32* %11
%98 = load i32, i32* %9
%99 = ashr i32 %98, 10
%100 = sub nsw i32 %99, 15
%101 = add nsw i32 %100, 127
store i32 %101, i32* %14
%102 = load i32, i32* %14
%103 = shl i32 %102, 23
store i32 %103, i32* %12
%104 = load i32, i32* %10
%105 = shl i32 %104, 13
store i32 %105, i32* %13
%106 = load i32, i32* %11
%107 = load i32, i32* %12
%108 = or i32 %106, %107
%109 = load i32, i32* %13
%110 = or i32 %108, %109
%111 = load i32*, i32** %4
%112 = getelementptr inbounds i32, i32* %111, i32 1
store i32* %112, i32** %4
store i32 %110, i32* %111
br label %113
113: ; preds = %95, %94
br label %114
114: ; preds = %113, %58
br label %115
115: ; preds = %114, %34
br label %23
116: ; preds = %23
br label %117
117: ; preds = %116, %21
ret void
}

LLVM IR (-O2):
define void @halfp2singles(i32* writeonly %0, i32* %1, i32 %2) {
%4 = icmp eq i32* %0, null
%5 = icmp eq i32* %1, null
%6 = or i1 %4, %5
%7 = icmp eq i32 %2, 0
%8 = or i1 %6, %7
br i1 %8, label %55, label %9
9: ; preds = %3, %51
%10 = phi i32 [ %13, %51 ], [ %2, %3 ]
%11 = phi i32* [ %53, %51 ], [ %0, %3 ]
%12 = phi i32* [ %14, %51 ], [ %1, %3 ]
%13 = add nsw i32 %10, -1
%14 = getelementptr inbounds i32, i32* %12, i64 1
%15 = load i32, i32* %12
%16 = and i32 %15, 32767
%17 = icmp eq i32 %16, 0
br i1 %17, label %18, label %20
18: ; preds = %9
%19 = shl i32 %15, 16
br label %51
20: ; preds = %9
%21 = and i32 %15, 32768
%22 = and i32 %15, 31744
%23 = and i32 %15, 1023
switch i32 %22, label %44 [
i32 0, label %24
i32 31744, label %39
]
24: ; preds = %20, %24
%25 = phi i32 [ %28, %24 ], [ %23, %20 ]
%26 = phi i32 [ %27, %24 ], [ -1, %20 ]
%27 = add nsw i32 %26, 1
%28 = shl i32 %25, 1
%29 = and i32 %25, 512
%30 = icmp eq i32 %29, 0
br i1 %30, label %24, label %31
31: ; preds = %24
%32 = shl nuw i32 %21, 16
%33 = mul i32 %26, -8388608
%34 = add i32 %33, 931135488
%35 = shl i32 %25, 14
%36 = and i32 %35, 8372224
%37 = or i32 %36, %32
%38 = or i32 %37, %34
br label %51
39: ; preds = %20
%40 = icmp eq i32 %23, 0
br i1 %40, label %41, label %51
41: ; preds = %39
%42 = shl nuw i32 %21, 16
%43 = or i32 %42, 2139095040
br label %51
44: ; preds = %20
%45 = shl nuw i32 %21, 16
%46 = shl nuw nsw i32 %22, 13
%47 = add nuw nsw i32 %46, 939524096
%48 = shl nuw nsw i32 %23, 13
%49 = or i32 %47, %45
%50 = or i32 %49, %48
br label %51
51: ; preds = %39, %31, %41, %44, %18
%52 = phi i32 [ %38, %31 ], [ %43, %41 ], [ %50, %44 ], [ %19, %18 ], [ -4194304, %39 ]
store i32 %52, i32* %11
%53 = getelementptr inbounds i32, i32* %11, i64 1
%54 = icmp eq i32 %13, 0
br i1 %54, label %55, label %9
55: ; preds = %51, %3
ret void
}