int main(void) {
  float f1 = 0x1.0p+0;
  float f2 = 0x1.8p-24;
  roundingTest(f1, f2);
  float f3 = nondet_value();
  float f4 = nondet_value();
  assume((0x1.fffffep-1f < f3) && (f3 < 0x1.000002p+0f));
  assume((0x1.7ffffep-24f < f4) && (f4 < 0x1.800002p-24f));
  roundingTest(f3, f4);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movl   $0x0,-0x4(%rbp)
movss  0xec1(%rip),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xeb0(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0xc(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mov    $0x2,%al
call   1030 <roundingTest@plt>
mov    $0x0,%al
call   1040 <nondet_value@plt>
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x10(%rbp)
mov    $0x0,%al
call   1040 <nondet_value@plt>
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x10(%rbp),%xmm0
xor    %eax,%eax
movss  0xe5f(%rip),%xmm1
ucomiss %xmm1,%xmm0
mov    %al,-0x15(%rbp)
jbe    11bf <main+0x8f>
movss  0xe57(%rip),%xmm0
ucomiss -0x10(%rbp),%xmm0
seta   %al
mov    %al,-0x15(%rbp)
mov    -0x15(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1050 <assume@plt>
movss  -0x14(%rbp),%xmm0
xor    %eax,%eax
movss  0xe33(%rip),%xmm1
ucomiss %xmm1,%xmm0
mov    %al,-0x16(%rbp)
jbe    11fb <main+0xcb>
movss  0xe23(%rip),%xmm0
ucomiss -0x14(%rbp),%xmm0
seta   %al
mov    %al,-0x16(%rbp)
mov    -0x16(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1050 <assume@plt>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mov    $0x2,%al
call   1030 <roundingTest@plt>
xor    %eax,%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
sub    $0x10,%rsp
movsd  0xec3(%rip),%xmm0
movsd  0xec3(%rip),%xmm1
mov    $0x2,%al
call   1030 <roundingTest@plt>
xor    %eax,%eax
call   1040 <nondet_value@plt>
mov    %eax,%ebx
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,0xc(%rsp)
xor    %eax,%eax
call   1040 <nondet_value@plt>
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,0x8(%rsp)
xor    %edi,%edi
cmp    $0x1,%ebx
sete   %dil
xor    %eax,%eax
call   1050 <assume@plt>
xor    %edi,%edi
xor    %eax,%eax
call   1050 <assume@plt>
movss  0xc(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  0x8(%rsp),%xmm1
cvtss2sd %xmm1,%xmm1
mov    $0x2,%al
call   1030 <roundingTest@plt>
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca float
%3 = alloca float
%4 = alloca float
%5 = alloca float
store i32 0, i32* %1
store float 1.000000e+00, float* %2
store float 0x3E78000000000000, float* %3
%6 = load float, float* %2
%7 = fpext float %6 to double
%8 = load float, float* %3
%9 = fpext float %8 to double
%10 = call i32 (double, double, ...) bitcast (i32 (...)* @roundingTest to i32 (double, double, ...)*)(double %7, double %9)
%11 = call i32 (...) @nondet_value()
%12 = sitofp i32 %11 to float
store float %12, float* %4
%13 = call i32 (...) @nondet_value()
%14 = sitofp i32 %13 to float
store float %14, float* %5
%15 = load float, float* %4
%16 = fcmp olt float 0x3FEFFFFFE0000000, %15
br i1 %16, label %17, label %20
17: ; preds = %0
%18 = load float, float* %4
%19 = fcmp olt float %18, 0x3FF0000020000000
br label %20
20: ; preds = %17, %0
%21 = phi i1 [ false, %0 ], [ %19, %17 ]
%22 = zext i1 %21 to i32
%23 = call i32 (i32, ...) bitcast (i32 (...)* @assume to i32 (i32, ...)*)(i32 %22)
%24 = load float, float* %5
%25 = fcmp olt float 0x3E77FFFFE0000000, %24
br i1 %25, label %26, label %29
26: ; preds = %20
%27 = load float, float* %5
%28 = fcmp olt float %27, 0x3E78000020000000
br label %29
29: ; preds = %26, %20
%30 = phi i1 [ false, %20 ], [ %28, %26 ]
%31 = zext i1 %30 to i32
%32 = call i32 (i32, ...) bitcast (i32 (...)* @assume to i32 (i32, ...)*)(i32 %31)
%33 = load float, float* %4
%34 = fpext float %33 to double
%35 = load float, float* %5
%36 = fpext float %35 to double
%37 = call i32 (double, double, ...) bitcast (i32 (...)* @roundingTest to i32 (double, double, ...)*)(double %34, double %36)
ret i32 0
}

LLVM IR (-O2):
define i32 @main() {
%1 = tail call i32 (double, double, ...) bitcast (i32 (...)* @roundingTest to i32 (double, double, ...)*)(double 1.000000e+00, double 0x3E78000000000000)
%2 = tail call i32 (...) @nondet_value()
%3 = sitofp i32 %2 to float
%4 = tail call i32 (...) @nondet_value()
%5 = sitofp i32 %4 to float
%6 = icmp eq i32 %2, 1
%7 = zext i1 %6 to i32
%8 = tail call i32 (i32, ...) bitcast (i32 (...)* @assume to i32 (i32, ...)*)(i32 %7)
%9 = tail call i32 (i32, ...) bitcast (i32 (...)* @assume to i32 (i32, ...)*)(i32 0)
%10 = fpext float %3 to double
%11 = fpext float %5 to double
%12 = tail call i32 (double, double, ...) bitcast (i32 (...)* @roundingTest to i32 (double, double, ...)*)(double %10, double %11)
ret i32 0
}