int eb_float_to_d2c(float src, unsigned char *tgt_lsb, unsigned char *tgt_msb) {
  if (src < -2047.999 || src > 2047.999) {
    *tgt_msb = (unsigned char)(0x80);
    *tgt_lsb = (unsigned char)(0x00);
    return 0;
  } else {
    *tgt_lsb = (((unsigned char)(((unsigned char)src) % 16) << 4) +
                ((unsigned char)((src - ((unsigned char)src)) * 16.0)));
    if (src < 0.0 && *tgt_lsb != 0x00)
      *tgt_msb = (unsigned char)((src / 16.0) - 1);
    else
      *tgt_msb = (unsigned char)(src / 16.0);
    if (src >= 0.0)
      return 1;
    else
      return -1;
  }
}


x86 assembly (clang, -O0):
<eb_float_to_d2c>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xede(%rip),%xmm0
ucomisd %xmm1,%xmm0
ja     1147 <eb_float_to_d2c+0x47>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xecb(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1161 <eb_float_to_d2c+0x61>
mov    -0x18(%rbp),%rax
movb   $0x80,(%rax)
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1240 <eb_float_to_d2c+0x140>
movss  -0x8(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %al,%cl
movzbl %cl,%ecx
and    $0xf,%eax
shl    $0x4,%eax
cvtsi2ss %ecx,%xmm1
subss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe87(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%ecx
movzbl %cl,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11f6 <eb_float_to_d2c+0xf6>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
je     11f6 <eb_float_to_d2c+0xf6>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe3b(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  0xe37(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
jmp    1217 <eb_float_to_d2c+0x117>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe09(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1239 <eb_float_to_d2c+0x139>
movl   $0x1,-0x4(%rbp)
jmp    1240 <eb_float_to_d2c+0x140>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<eb_float_to_d2c>:
cvtss2sd %xmm0,%xmm1
movsd  0xef4(%rip),%xmm2
ucomisd %xmm1,%xmm2
ja     1187 <eb_float_to_d2c+0x87>
ucomisd 0xeee(%rip),%xmm1
ja     1187 <eb_float_to_d2c+0x87>
cvttss2si %xmm0,%eax
movzbl %al,%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
shl    $0x4,%al
movaps %xmm0,%xmm3
subss  %xmm2,%xmm3
xorps  %xmm2,%xmm2
cvtss2sd %xmm3,%xmm2
mulsd  0xecd(%rip),%xmm2
cvttsd2si %xmm2,%ecx
mulsd  0xec9(%rip),%xmm1
movapd %xmm1,%xmm2
add    %al,%cl
mov    %cl,(%rdi)
je     1165 <eb_float_to_d2c+0x65>
movsd  0xebf(%rip),%xmm2
addsd  %xmm1,%xmm2
xorps  %xmm3,%xmm3
ucomiss %xmm0,%xmm3
jbe    1171 <eb_float_to_d2c+0x71>
movapd %xmm2,%xmm1
cvttsd2si %xmm1,%eax
mov    %al,(%rsi)
mov    $0x1,%eax
ucomiss %xmm3,%xmm0
jae    1186 <eb_float_to_d2c+0x86>
mov    $0xffffffff,%eax
ret
movb   $0x80,(%rsi)
movb   $0x0,(%rdi)
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @eb_float_to_d2c(float %0, i8* %1, i8* %2) {
%4 = alloca i32
%5 = alloca float
%6 = alloca i8*
%7 = alloca i8*
store float %0, float* %5
store i8* %1, i8** %6
store i8* %2, i8** %7
%8 = load float, float* %5
%9 = fpext float %8 to double
%10 = fcmp olt double %9, 0xC09FFFFEF9DB22D1
br i1 %10, label %15, label %11
11: ; preds = %3
%12 = load float, float* %5
%13 = fpext float %12 to double
%14 = fcmp ogt double %13, 0x409FFFFEF9DB22D1
br i1 %14, label %15, label %18
15: ; preds = %11, %3
%16 = load i8*, i8** %7
store i8 -128, i8* %16
%17 = load i8*, i8** %6
store i8 0, i8* %17
store i32 0, i32* %4
br label %66
18: ; preds = %11
%19 = load float, float* %5
%20 = fptoui float %19 to i8
%21 = zext i8 %20 to i32
%22 = srem i32 %21, 16
%23 = trunc i32 %22 to i8
%24 = zext i8 %23 to i32
%25 = shl i32 %24, 4
%26 = load float, float* %5
%27 = load float, float* %5
%28 = fptoui float %27 to i8
%29 = zext i8 %28 to i32
%30 = sitofp i32 %29 to float
%31 = fsub float %26, %30
%32 = fpext float %31 to double
%33 = fmul double %32, 1.600000e+01
%34 = fptoui double %33 to i8
%35 = zext i8 %34 to i32
%36 = add nsw i32 %25, %35
%37 = trunc i32 %36 to i8
%38 = load i8*, i8** %6
store i8 %37, i8* %38
%39 = load float, float* %5
%40 = fpext float %39 to double
%41 = fcmp olt double %40, 0.000000e+00
br i1 %41, label %42, label %54
42: ; preds = %18
%43 = load i8*, i8** %6
%44 = load i8, i8* %43
%45 = zext i8 %44 to i32
%46 = icmp ne i32 %45, 0
br i1 %46, label %47, label %54
47: ; preds = %42
%48 = load float, float* %5
%49 = fpext float %48 to double
%50 = fdiv double %49, 1.600000e+01
%51 = fsub double %50, 1.000000e+00
%52 = fptoui double %51 to i8
%53 = load i8*, i8** %7
store i8 %52, i8* %53
br label %60
54: ; preds = %42, %18
%55 = load float, float* %5
%56 = fpext float %55 to double
%57 = fdiv double %56, 1.600000e+01
%58 = fptoui double %57 to i8
%59 = load i8*, i8** %7
store i8 %58, i8* %59
br label %60
60: ; preds = %54, %47
%61 = load float, float* %5
%62 = fpext float %61 to double
%63 = fcmp oge double %62, 0.000000e+00
br i1 %63, label %64, label %65
64: ; preds = %60
store i32 1, i32* %4
br label %66
65: ; preds = %60
store i32 -1, i32* %4
br label %66
66: ; preds = %65, %64, %15
%67 = load i32, i32* %4
ret i32 %67
}

LLVM IR (-O2):
define i32 @eb_float_to_d2c(float %0, i8* nocapture writeonly %1, i8* nocapture writeonly %2) {
%4 = fpext float %0 to double
%5 = fcmp olt double %4, 0xC09FFFFEF9DB22D1
%6 = fcmp ogt double %4, 0x409FFFFEF9DB22D1
%7 = or i1 %5, %6
br i1 %7, label %8, label %9
8: ; preds = %3
store i8 -128, i8* %2
store i8 0, i8* %1
br label %27
9: ; preds = %3
%10 = fptoui float %0 to i8
%11 = shl i8 %10, 4
%12 = uitofp i8 %10 to float
%13 = fsub float %0, %12
%14 = fpext float %13 to double
%15 = fmul double %14, 1.600000e+01
%16 = fptoui double %15 to i8
%17 = add i8 %11, %16
store i8 %17, i8* %1
%18 = fcmp uge float %0, 0.000000e+00
%19 = icmp eq i8 %17, 0
%20 = select i1 %18, i1 true, i1 %19
%21 = fmul double %4, 6.250000e-02
%22 = fadd double %21, -1.000000e+00
%23 = select i1 %20, double %21, double %22
%24 = fptoui double %23 to i8
store i8 %24, i8* %2
%25 = fcmp ult float %0, 0.000000e+00
br i1 %25, label %26, label %27
26: ; preds = %9
br label %27
27: ; preds = %9, %26, %8
%28 = phi i32 [ 0, %8 ], [ -1, %26 ], [ 1, %9 ]
ret i32 %28
}