#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 */

/* Variables and functions */
int SETFFLAGS(double, int);
int /*<<< orphan*/ printf(char *, int /*<<< orphan*/, double);
int /*<<< orphan*/ puts(char *);
int /*<<< orphan*/ scanf(char *, float *);
int main(int argc, char *argv[], char *envp[]) {
  int eax;
  float local0;
  double st;
  scanf("%f", &local0);
  printf("a is %f, b is %f\n", 0, 2.3125);
  st = local0;
  eax = ((eax & 0xffff00ff | SETFFLAGS(st, 5.) * 256) >> 8 & 0xffffff &
             0xffff00ff |
         (SETFFLAGS(st, 5.) & 0x45) * 256) &
            0xffff00ff |
        (SETFFLAGS(st, 5.) & 0x45 ^ 64) * 256;
  if (st == 5.) {
    puts("Equal");
  }
  st = local0;
  eax = (eax & 0xffff00ff | SETFFLAGS(5., st) * 256) >> 8 & 0xffffff &
            0xffff00ff |
        (SETFFLAGS(5., st) & 0x45) * 256;
  if (5. != st) {
    puts("Not Equal");
  }
  st = local0;
  eax = (eax & 0xffff00ff | SETFFLAGS(5., st) * 256) >> 8 & 0xffffff;
  if (5. > st) {
    puts("Greater");
  }
  st = local0;
  eax = (eax & 0xffff00ff | SETFFLAGS(st, 5.) * 256) >> 8 & 0xffffff;
  if (st >= 5.) {
    puts("Less or Equal");
  }
  st = local0;
  eax = (eax & 0xffff00ff | SETFFLAGS(5., st) * 256) >> 8 & 0xffffff;
  if (5. >= st) {
    puts("Greater or Equal");
  }
  st = local0;
  eax = (eax & 0xffff00ff | SETFFLAGS(st, 5.) * 256) >> 8 & 0xffffff;
  if (st > 5.) {
    puts("Less");
  }
  return eax;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
lea    0xeaf(%rip),%rdi
lea    -0x20(%rbp),%rsi
call   1050 <scanf@plt>
lea    0xea2(%rip),%rdi
xor    %esi,%esi
movsd  0xe8d(%rip),%xmm0
call   1040 <printf@plt>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xffff00ff,%eax
mov    %eax,-0x34(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x34(%rbp),%eax
shl    $0x8,%ecx
or     %ecx,%eax
shr    $0x8,%eax
and    $0xffffff,%eax
and    $0xffff00ff,%eax
mov    %eax,-0x30(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x30(%rbp),%eax
and    $0x45,%ecx
shl    $0x8,%ecx
or     %ecx,%eax
and    $0xffff00ff,%eax
mov    %eax,-0x2c(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x2c(%rbp),%eax
and    $0x45,%ecx
xor    $0x40,%ecx
shl    $0x8,%ecx
or     %ecx,%eax
mov    %eax,-0x1c(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xdeb(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1231 <main+0xf1>
jp     1231 <main+0xf1>
lea    0xe24(%rip),%rdi
call   1030 <puts@plt>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xffff00ff,%eax
mov    %eax,-0x3c(%rbp)
cvttsd2si -0x28(%rbp),%edi
movsd  0xda9(%rip),%xmm0
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x3c(%rbp),%eax
shl    $0x8,%ecx
or     %ecx,%eax
shr    $0x8,%eax
and    $0xffffff,%eax
and    $0xffff00ff,%eax
mov    %eax,-0x38(%rbp)
cvttsd2si -0x28(%rbp),%edi
movsd  0xd7d(%rip),%xmm0
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x38(%rbp),%eax
and    $0x45,%ecx
shl    $0x8,%ecx
or     %ecx,%eax
mov    %eax,-0x1c(%rbp)
movsd  0xd60(%rip),%xmm0
ucomisd -0x28(%rbp),%xmm0
jne    12b6 <main+0x176>
jp     12b6 <main+0x176>
jmp    12c2 <main+0x182>
lea    0xd68(%rip),%rdi
call   1030 <puts@plt>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xffff00ff,%eax
mov    %eax,-0x40(%rbp)
cvttsd2si -0x28(%rbp),%edi
movsd  0xd18(%rip),%xmm0
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x40(%rbp),%eax
shl    $0x8,%ecx
or     %ecx,%eax
shr    $0x8,%eax
and    $0xffffff,%eax
mov    %eax,-0x1c(%rbp)
movsd  0xcf6(%rip),%xmm0
ucomisd -0x28(%rbp),%xmm0
jbe    1321 <main+0x1e1>
lea    0xd13(%rip),%rdi
call   1030 <puts@plt>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xffff00ff,%eax
mov    %eax,-0x44(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x44(%rbp),%eax
shl    $0x8,%ecx
or     %ecx,%eax
shr    $0x8,%eax
and    $0xffffff,%eax
mov    %eax,-0x1c(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xc95(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1381 <main+0x241>
lea    0xcbb(%rip),%rdi
call   1030 <puts@plt>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xffff00ff,%eax
mov    %eax,-0x48(%rbp)
cvttsd2si -0x28(%rbp),%edi
movsd  0xc59(%rip),%xmm0
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x48(%rbp),%eax
shl    $0x8,%ecx
or     %ecx,%eax
shr    $0x8,%eax
and    $0xffffff,%eax
mov    %eax,-0x1c(%rbp)
movsd  0xc37(%rip),%xmm0
ucomisd -0x28(%rbp),%xmm0
jb     13e0 <main+0x2a0>
lea    0xc6a(%rip),%rdi
call   1030 <puts@plt>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xffff00ff,%eax
mov    %eax,-0x4c(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
mov    %eax,%ecx
mov    -0x4c(%rbp),%eax
shl    $0x8,%ecx
or     %ecx,%eax
shr    $0x8,%eax
and    $0xffffff,%eax
mov    %eax,-0x1c(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xbd6(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1440 <main+0x300>
lea    0xc1b(%rip),%rdi
call   1030 <puts@plt>
mov    -0x1c(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %rbx
sub    $0x18,%rsp
lea    0xec7(%rip),%rdi
lea    0x4(%rsp),%rsi
call   1050 <scanf@plt>
lea    0xeb9(%rip),%rdi
movsd  0xe9a(%rip),%xmm0
xor    %esi,%esi
call   1040 <printf@plt>
movss  0x4(%rsp),%xmm0
movss  %xmm0,0x14(%rsp)
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,0x8(%rsp)
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
movsd  0x8(%rsp),%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
movsd  0x8(%rsp),%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
movss  0x14(%rsp),%xmm0
ucomiss 0xe56(%rip),%xmm0
jne    11ca <main+0x8a>
jp     11ca <main+0x8a>
lea    0xe8f(%rip),%rdi
call   1030 <puts@plt>
movss  0x4(%rsp),%xmm0
movss  %xmm0,0x8(%rsp)
cvttss2si %xmm0,%ebx
movsd  0xe26(%rip),%xmm0
mov    %ebx,%edi
call   1060 <SETFFLAGS@plt>
movsd  0xe17(%rip),%xmm0
mov    %ebx,%edi
call   1060 <SETFFLAGS@plt>
movss  0x8(%rsp),%xmm0
ucomiss 0xe0b(%rip),%xmm0
jne    1209 <main+0xc9>
jnp    1215 <main+0xd5>
lea    0xe19(%rip),%rdi
call   1030 <puts@plt>
movss  0x4(%rsp),%xmm0
movss  %xmm0,0x8(%rsp)
cvttss2si %xmm0,%edi
movsd  0xddb(%rip),%xmm0
call   1060 <SETFFLAGS@plt>
movss  0xdd6(%rip),%xmm0
ucomiss 0x8(%rsp),%xmm0
jbe    124d <main+0x10d>
lea    0xdeb(%rip),%rdi
call   1030 <puts@plt>
movss  0x4(%rsp),%xmm0
movss  %xmm0,0x8(%rsp)
cvtss2sd %xmm0,%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
movss  0x8(%rsp),%xmm0
ucomiss 0xd9c(%rip),%xmm0
jb     1282 <main+0x142>
lea    0xdbe(%rip),%rdi
call   1030 <puts@plt>
movss  0x4(%rsp),%xmm0
movss  %xmm0,0x8(%rsp)
cvttss2si %xmm0,%edi
movsd  0xd6e(%rip),%xmm0
call   1060 <SETFFLAGS@plt>
mov    %eax,%ebx
movss  0xd67(%rip),%xmm0
ucomiss 0x8(%rsp),%xmm0
jb     12bc <main+0x17c>
lea    0xd92(%rip),%rdi
call   1030 <puts@plt>
movss  0x4(%rsp),%xmm0
movss  %xmm0,0x8(%rsp)
cvtss2sd %xmm0,%xmm0
mov    $0x5,%edi
call   1060 <SETFFLAGS@plt>
mov    %eax,%ebp
movss  0x8(%rsp),%xmm0
ucomiss 0xd2b(%rip),%xmm0
jbe    12f3 <main+0x1b3>
lea    0xd6c(%rip),%rdi
call   1030 <puts@plt>
and    $0xff0000,%ebx
shl    $0x8,%ebp
or     %ebx,%ebp
shr    $0x8,%ebp
mov    %ebp,%eax
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
@.str = [3 x i8] c"%f\00"
@.str.1 = [18 x i8] c"a is %f, b is %f\0A\00"
@.str.2 = [6 x i8] c"Equal\00"
@.str.3 = [10 x i8] c"Not Equal\00"
@.str.4 = [8 x i8] c"Greater\00"
@.str.5 = [14 x i8] c"Less or Equal\00"
@.str.6 = [17 x i8] c"Greater or Equal\00"
@.str.7 = [5 x i8] c"Less\00"
define i32 @main(i32 %0, i8** %1, i8** %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i8**
%7 = alloca i8**
%8 = alloca i32
%9 = alloca float
%10 = alloca double
store i32 0, i32* %4
store i32 %0, i32* %5
store i8** %1, i8*** %6
store i8** %2, i8*** %7
%11 = call i32 @scanf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), float* %9)
%12 = call i32 @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i64 0, i64 0), i32 0, double 2.312500e+00)
%13 = load float, float* %9
%14 = fpext float %13 to double
store double %14, double* %10
%15 = load i32, i32* %8
%16 = and i32 %15, -65281
%17 = load double, double* %10
%18 = call i32 @SETFFLAGS(double %17, i32 5)
%19 = mul nsw i32 %18, 256
%20 = or i32 %16, %19
%21 = lshr i32 %20, 8
%22 = and i32 %21, 16777215
%23 = and i32 %22, -65281
%24 = load double, double* %10
%25 = call i32 @SETFFLAGS(double %24, i32 5)
%26 = and i32 %25, 69
%27 = mul nsw i32 %26, 256
%28 = or i32 %23, %27
%29 = and i32 %28, -65281
%30 = load double, double* %10
%31 = call i32 @SETFFLAGS(double %30, i32 5)
%32 = and i32 %31, 69
%33 = xor i32 %32, 64
%34 = mul nsw i32 %33, 256
%35 = or i32 %29, %34
store i32 %35, i32* %8
%36 = load double, double* %10
%37 = fcmp oeq double %36, 5.000000e+00
br i1 %37, label %38, label %40
38: ; preds = %3
%39 = call i32 @puts(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0))
br label %40
40: ; preds = %38, %3
%41 = load float, float* %9
%42 = fpext float %41 to double
store double %42, double* %10
%43 = load i32, i32* %8
%44 = and i32 %43, -65281
%45 = load double, double* %10
%46 = fptosi double %45 to i32
%47 = call i32 @SETFFLAGS(double 5.000000e+00, i32 %46)
%48 = mul nsw i32 %47, 256
%49 = or i32 %44, %48
%50 = lshr i32 %49, 8
%51 = and i32 %50, 16777215
%52 = and i32 %51, -65281
%53 = load double, double* %10
%54 = fptosi double %53 to i32
%55 = call i32 @SETFFLAGS(double 5.000000e+00, i32 %54)
%56 = and i32 %55, 69
%57 = mul nsw i32 %56, 256
%58 = or i32 %52, %57
store i32 %58, i32* %8
%59 = load double, double* %10
%60 = fcmp une double 5.000000e+00, %59
br i1 %60, label %61, label %63
61: ; preds = %40
%62 = call i32 @puts(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i64 0, i64 0))
br label %63
63: ; preds = %61, %40
%64 = load float, float* %9
%65 = fpext float %64 to double
store double %65, double* %10
%66 = load i32, i32* %8
%67 = and i32 %66, -65281
%68 = load double, double* %10
%69 = fptosi double %68 to i32
%70 = call i32 @SETFFLAGS(double 5.000000e+00, i32 %69)
%71 = mul nsw i32 %70, 256
%72 = or i32 %67, %71
%73 = lshr i32 %72, 8
%74 = and i32 %73, 16777215
store i32 %74, i32* %8
%75 = load double, double* %10
%76 = fcmp ogt double 5.000000e+00, %75
br i1 %76, label %77, label %79
77: ; preds = %63
%78 = call i32 @puts(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.4, i64 0, i64 0))
br label %79
79: ; preds = %77, %63
%80 = load float, float* %9
%81 = fpext float %80 to double
store double %81, double* %10
%82 = load i32, i32* %8
%83 = and i32 %82, -65281
%84 = load double, double* %10
%85 = call i32 @SETFFLAGS(double %84, i32 5)
%86 = mul nsw i32 %85, 256
%87 = or i32 %83, %86
%88 = lshr i32 %87, 8
%89 = and i32 %88, 16777215
store i32 %89, i32* %8
%90 = load double, double* %10
%91 = fcmp oge double %90, 5.000000e+00
br i1 %91, label %92, label %94
92: ; preds = %79
%93 = call i32 @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.5, i64 0, i64 0))
br label %94
94: ; preds = %92, %79
%95 = load float, float* %9
%96 = fpext float %95 to double
store double %96, double* %10
%97 = load i32, i32* %8
%98 = and i32 %97, -65281
%99 = load double, double* %10
%100 = fptosi double %99 to i32
%101 = call i32 @SETFFLAGS(double 5.000000e+00, i32 %100)
%102 = mul nsw i32 %101, 256
%103 = or i32 %98, %102
%104 = lshr i32 %103, 8
%105 = and i32 %104, 16777215
store i32 %105, i32* %8
%106 = load double, double* %10
%107 = fcmp oge double 5.000000e+00, %106
br i1 %107, label %108, label %110
108: ; preds = %94
%109 = call i32 @puts(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i64 0, i64 0))
br label %110
110: ; preds = %108, %94
%111 = load float, float* %9
%112 = fpext float %111 to double
store double %112, double* %10
%113 = load i32, i32* %8
%114 = and i32 %113, -65281
%115 = load double, double* %10
%116 = call i32 @SETFFLAGS(double %115, i32 5)
%117 = mul nsw i32 %116, 256
%118 = or i32 %114, %117
%119 = lshr i32 %118, 8
%120 = and i32 %119, 16777215
store i32 %120, i32* %8
%121 = load double, double* %10
%122 = fcmp ogt double %121, 5.000000e+00
br i1 %122, label %123, label %125
123: ; preds = %110
%124 = call i32 @puts(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.7, i64 0, i64 0))
br label %125
125: ; preds = %123, %110
%126 = load i32, i32* %8
ret i32 %126
}

LLVM IR (-O2):
@.str = [3 x i8] c"%f\00"
@.str.1 = [18 x i8] c"a is %f, b is %f\0A\00"
@.str.2 = [6 x i8] c"Equal\00"
@.str.3 = [10 x i8] c"Not Equal\00"
@.str.4 = [8 x i8] c"Greater\00"
@.str.5 = [14 x i8] c"Less or Equal\00"
@.str.6 = [17 x i8] c"Greater or Equal\00"
@.str.7 = [5 x i8] c"Less\00"
define i32 @main(i32 %0, i8** nocapture readnone %1, i8** nocapture readnone %2) {
%4 = alloca float
%5 = bitcast float* %4 to i8*
%6 = call i32 @scanf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), float* %4)
%7 = call i32 @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i64 0, i64 0), i32 0, double 2.312500e+00)
%8 = load float, float* %4
%9 = fpext float %8 to double
%10 = call i32 @SETFFLAGS(double %9, i32 5)
%11 = call i32 @SETFFLAGS(double %9, i32 5)
%12 = call i32 @SETFFLAGS(double %9, i32 5)
%13 = fcmp oeq float %8, 5.000000e+00
br i1 %13, label %14, label %16
14: ; preds = %3
%15 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0))
br label %16
16: ; preds = %14, %3
%17 = load float, float* %4
%18 = fptosi float %17 to i32
%19 = call i32 @SETFFLAGS(double 5.000000e+00, i32 %18)
%20 = call i32 @SETFFLAGS(double 5.000000e+00, i32 %18)
%21 = fcmp une float %17, 5.000000e+00
br i1 %21, label %22, label %24
22: ; preds = %16
%23 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i64 0, i64 0))
br label %24
24: ; preds = %22, %16
%25 = load float, float* %4
%26 = fptosi float %25 to i32
%27 = call i32 @SETFFLAGS(double 5.000000e+00, i32 %26)
%28 = fcmp olt float %25, 5.000000e+00
br i1 %28, label %29, label %31
29: ; preds = %24
%30 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @.str.4, i64 0, i64 0))
br label %31
31: ; preds = %29, %24
%32 = load float, float* %4
%33 = fpext float %32 to double
%34 = call i32 @SETFFLAGS(double %33, i32 5)
%35 = fcmp ult float %32, 5.000000e+00
br i1 %35, label %38, label %36
36: ; preds = %31
%37 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([14 x i8], [14 x i8]* @.str.5, i64 0, i64 0))
br label %38
38: ; preds = %36, %31
%39 = load float, float* %4
%40 = fptosi float %39 to i32
%41 = call i32 @SETFFLAGS(double 5.000000e+00, i32 %40)
%42 = fcmp ugt float %39, 5.000000e+00
br i1 %42, label %45, label %43
43: ; preds = %38
%44 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i64 0, i64 0))
br label %45
45: ; preds = %43, %38
%46 = load float, float* %4
%47 = fpext float %46 to double
%48 = call i32 @SETFFLAGS(double %47, i32 5)
%49 = fcmp ogt float %46, 5.000000e+00
br i1 %49, label %50, label %52
50: ; preds = %45
%51 = call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.7, i64 0, i64 0))
br label %52
52: ; preds = %50, %45
%53 = and i32 %41, 16711680
%54 = shl nsw i32 %48, 8
%55 = or i32 %54, %53
%56 = lshr exact i32 %55, 8
ret i32 %56
}