int eb_float_to_d2b(float src, unsigned char *tgt_lsb, unsigned char *tgt_msb) {
  if (src < -127.999 || src > 127.999) {
    *tgt_msb = (unsigned char)(0x80);
    *tgt_lsb = (unsigned char)(0x00);
    return 0;
  } else {
    *tgt_lsb = (unsigned char)((src - ((unsigned char)src)) * 256.0);
    if (src < 0.0 && *tgt_lsb != 0x00)
      *tgt_msb = (unsigned char)(src - 1);
    else
      *tgt_msb = (unsigned char)(src);
    if (src >= 0.0)
      return 1;
    else
      return -1;
  }
}


x86 assembly (clang, -O0):
<eb_float_to_d2b>:
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_d2b+0x47>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xecb(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1161 <eb_float_to_d2b+0x61>
mov    -0x18(%rbp),%rax
movb   $0x80,(%rax)
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    120f <eb_float_to_d2b+0x10f>
movss  -0x8(%rbp),%xmm0
cvttss2si %xmm0,%eax
movzbl %al,%eax
cvtsi2ss %eax,%xmm1
subss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe8f(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%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    11d9 <eb_float_to_d2b+0xd9>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x0,%eax
je     11d9 <eb_float_to_d2b+0xd9>
movss  -0x8(%rbp),%xmm0
movss  0xe54(%rip),%xmm1
addss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
mov    %al,%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
jmp    11e6 <eb_float_to_d2b+0xe6>
cvttss2si -0x8(%rbp),%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     1208 <eb_float_to_d2b+0x108>
movl   $0x1,-0x4(%rbp)
jmp    120f <eb_float_to_d2b+0x10f>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<eb_float_to_d2b>:
cvtss2sd %xmm0,%xmm1
movsd  0xef4(%rip),%xmm2
ucomisd %xmm1,%xmm2
ja     1176 <eb_float_to_d2b+0x76>
ucomisd 0xeee(%rip),%xmm1
ja     1176 <eb_float_to_d2b+0x76>
cvttss2si %xmm0,%eax
movzbl %al,%ecx
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
movaps %xmm0,%xmm2
subss  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
mulsd  0xed0(%rip),%xmm1
cvttsd2si %xmm1,%ecx
test   %cl,%cl
movss  0xeca(%rip),%xmm1
addss  %xmm0,%xmm1
cvttss2si %xmm1,%edx
cmove  %eax,%edx
xorps  %xmm1,%xmm1
ucomiss %xmm0,%xmm1
mov    %cl,(%rdi)
cmovbe %eax,%edx
mov    %dl,(%rsi)
mov    $0x1,%eax
ucomiss %xmm1,%xmm0
jae    1175 <eb_float_to_d2b+0x75>
mov    $0xffffffff,%eax
ret
movb   $0x80,(%rsi)
movb   $0x0,(%rdi)
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @eb_float_to_d2b(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, -1.279990e+02
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, 1.279990e+02
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 %52
18: ; preds = %11
%19 = load float, float* %5
%20 = load float, float* %5
%21 = fptoui float %20 to i8
%22 = zext i8 %21 to i32
%23 = sitofp i32 %22 to float
%24 = fsub float %19, %23
%25 = fpext float %24 to double
%26 = fmul double %25, 2.560000e+02
%27 = fptoui double %26 to i8
%28 = load i8*, i8** %6
store i8 %27, i8* %28
%29 = load float, float* %5
%30 = fpext float %29 to double
%31 = fcmp olt double %30, 0.000000e+00
br i1 %31, label %32, label %42
32: ; preds = %18
%33 = load i8*, i8** %6
%34 = load i8, i8* %33
%35 = zext i8 %34 to i32
%36 = icmp ne i32 %35, 0
br i1 %36, label %37, label %42
37: ; preds = %32
%38 = load float, float* %5
%39 = fsub float %38, 1.000000e+00
%40 = fptoui float %39 to i8
%41 = load i8*, i8** %7
store i8 %40, i8* %41
br label %46
42: ; preds = %32, %18
%43 = load float, float* %5
%44 = fptoui float %43 to i8
%45 = load i8*, i8** %7
store i8 %44, i8* %45
br label %46
46: ; preds = %42, %37
%47 = load float, float* %5
%48 = fpext float %47 to double
%49 = fcmp oge double %48, 0.000000e+00
br i1 %49, label %50, label %51
50: ; preds = %46
store i32 1, i32* %4
br label %52
51: ; preds = %46
store i32 -1, i32* %4
br label %52
52: ; preds = %51, %50, %15
%53 = load i32, i32* %4
ret i32 %53
}

LLVM IR (-O2):
define i32 @eb_float_to_d2b(float %0, i8* nocapture writeonly %1, i8* nocapture writeonly %2) {
%4 = fpext float %0 to double
%5 = fcmp olt double %4, -1.279990e+02
%6 = fcmp ogt double %4, 1.279990e+02
%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 %24
9: ; preds = %3
%10 = fptoui float %0 to i8
%11 = uitofp i8 %10 to float
%12 = fsub float %0, %11
%13 = fpext float %12 to double
%14 = fmul double %13, 2.560000e+02
%15 = fptoui double %14 to i8
store i8 %15, i8* %1
%16 = fcmp uge float %0, 0.000000e+00
%17 = icmp eq i8 %15, 0
%18 = select i1 %16, i1 true, i1 %17
%19 = fadd float %0, -1.000000e+00
%20 = fptoui float %19 to i8
%21 = select i1 %18, i8 %10, i8 %20
store i8 %21, i8* %2
%22 = fcmp ult float %0, 0.000000e+00
br i1 %22, label %23, label %24
23: ; preds = %9
br label %24
24: ; preds = %9, %23, %8
%25 = phi i32 [ 0, %8 ], [ -1, %23 ], [ 1, %9 ]
ret i32 %25
}