#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 */
double divide(int, int);
double multi(double, int);
int /*<<< orphan*/ puts(int);
int soma(double, double);
double subtrai(double, double);
void test() {
  puts(soma(4.5, 5.5) == 10);
  puts(subtrai(3.1, 2.0) == 1.1);
  puts(multi(3.2, 2) == 6.4);
  puts(divide(5, 2) == 2.5);
}


x86 assembly (clang, -O0):
<test>:
push   %rbp
mov    %rsp,%rbp
movsd  0xed4(%rip),%xmm0
movsd  0xed4(%rip),%xmm1
call   1060 <soma@plt>
cmp    $0xa,%eax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <puts@plt>
movsd  0xe9f(%rip),%xmm0
movsd  0xe9f(%rip),%xmm1
call   1070 <subtrai@plt>
movsd  0xe82(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <puts@plt>
movsd  0xe5c(%rip),%xmm0
mov    $0x2,%edi
call   1050 <multi@plt>
movsd  0xe42(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <puts@plt>
mov    $0x5,%edi
mov    $0x2,%esi
call   1040 <divide@plt>
movsd  0xe0d(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <puts@plt>
pop    %rbp
ret

x86 assembly (clang, -O2):
<test>:
push   %rax
movsd  0xea7(%rip),%xmm0
movsd  0xea7(%rip),%xmm1
call   1060 <soma@plt>
xor    %edi,%edi
cmp    $0xa,%eax
sete   %dil
call   1030 <puts@plt>
movsd  0xe94(%rip),%xmm0
movsd  0xe94(%rip),%xmm1
call   1070 <subtrai@plt>
cmpeqsd 0xe8e(%rip),%xmm0
movq   %xmm0,%rdi
and    $0x1,%edi
call   1030 <puts@plt>
movsd  0xe81(%rip),%xmm0
mov    $0x2,%edi
call   1050 <multi@plt>
cmpeqsd 0xe76(%rip),%xmm0
movq   %xmm0,%rdi
and    $0x1,%edi
call   1030 <puts@plt>
mov    $0x5,%edi
mov    $0x2,%esi
call   1040 <divide@plt>
cmpeqsd 0xe59(%rip),%xmm0
movq   %xmm0,%rdi
and    $0x1,%edi
pop    %rax
jmp    1030 <puts@plt>

LLVM IR (-O0):
define void @test() {
%1 = call i32 @soma(double 4.500000e+00, double 5.500000e+00)
%2 = icmp eq i32 %1, 10
%3 = zext i1 %2 to i32
%4 = call i32 @puts(i32 %3)
%5 = call double @subtrai(double 3.100000e+00, double 2.000000e+00)
%6 = fcmp oeq double %5, 1.100000e+00
%7 = zext i1 %6 to i32
%8 = call i32 @puts(i32 %7)
%9 = call double @multi(double 3.200000e+00, i32 2)
%10 = fcmp oeq double %9, 6.400000e+00
%11 = zext i1 %10 to i32
%12 = call i32 @puts(i32 %11)
%13 = call double @divide(i32 5, i32 2)
%14 = fcmp oeq double %13, 2.500000e+00
%15 = zext i1 %14 to i32
%16 = call i32 @puts(i32 %15)
ret void
}

LLVM IR (-O2):
define void @test() {
%1 = tail call i32 @soma(double 4.500000e+00, double 5.500000e+00)
%2 = icmp eq i32 %1, 10
%3 = zext i1 %2 to i32
%4 = tail call i32 @puts(i32 %3)
%5 = tail call double @subtrai(double 3.100000e+00, double 2.000000e+00)
%6 = fcmp oeq double %5, 1.100000e+00
%7 = zext i1 %6 to i32
%8 = tail call i32 @puts(i32 %7)
%9 = tail call double @multi(double 3.200000e+00, i32 2)
%10 = fcmp oeq double %9, 6.400000e+00
%11 = zext i1 %10 to i32
%12 = tail call i32 @puts(i32 %11)
%13 = tail call double @divide(i32 5, i32 2)
%14 = fcmp oeq double %13, 2.500000e+00
%15 = zext i1 %14 to i32
%16 = tail call i32 @puts(i32 %15)
ret void
}