#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 /*<<< orphan*/ assert_or_panic(int);
void c_five_floats(float a, float b, float c, float d, float e) {
  assert_or_panic(a == 1.0);
  assert_or_panic(b == 2.0);
  assert_or_panic(c == 3.0);
  assert_or_panic(d == 4.0);
  assert_or_panic(e == 5.0);
}


x86 assembly (clang, -O0):
<c_five_floats>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  %xmm3,-0x10(%rbp)
movss  %xmm4,-0x14(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xede(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert_or_panic@plt>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeaf(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert_or_panic@plt>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe80(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert_or_panic@plt>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe51(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert_or_panic@plt>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe22(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert_or_panic@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<c_five_floats>:
sub    $0x18,%rsp
movss  %xmm4,0x14(%rsp)
movss  %xmm3,0x10(%rsp)
movss  %xmm2,0xc(%rsp)
movss  %xmm1,0x8(%rsp)
cmpeqss 0xecb(%rip),%xmm0
movd   %xmm0,%edi
and    $0x1,%edi
call   1030 <assert_or_panic@plt>
movss  0x8(%rsp),%xmm0
cmpeqss 0xeb4(%rip),%xmm0
movd   %xmm0,%edi
and    $0x1,%edi
call   1030 <assert_or_panic@plt>
movss  0xc(%rsp),%xmm0
cmpeqss 0xe9d(%rip),%xmm0
movd   %xmm0,%edi
and    $0x1,%edi
call   1030 <assert_or_panic@plt>
movss  0x10(%rsp),%xmm0
cmpeqss 0xe86(%rip),%xmm0
movd   %xmm0,%edi
and    $0x1,%edi
call   1030 <assert_or_panic@plt>
movss  0x14(%rsp),%xmm0
cmpeqss 0xe6f(%rip),%xmm0
movd   %xmm0,%edi
and    $0x1,%edi
add    $0x18,%rsp
jmp    1030 <assert_or_panic@plt>

LLVM IR (-O0):
define void @c_five_floats(float %0, float %1, float %2, float %3, float %4) {
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
store float %0, float* %6
store float %1, float* %7
store float %2, float* %8
store float %3, float* %9
store float %4, float* %10
%11 = load float, float* %6
%12 = fpext float %11 to double
%13 = fcmp oeq double %12, 1.000000e+00
%14 = zext i1 %13 to i32
%15 = call i32 @assert_or_panic(i32 %14)
%16 = load float, float* %7
%17 = fpext float %16 to double
%18 = fcmp oeq double %17, 2.000000e+00
%19 = zext i1 %18 to i32
%20 = call i32 @assert_or_panic(i32 %19)
%21 = load float, float* %8
%22 = fpext float %21 to double
%23 = fcmp oeq double %22, 3.000000e+00
%24 = zext i1 %23 to i32
%25 = call i32 @assert_or_panic(i32 %24)
%26 = load float, float* %9
%27 = fpext float %26 to double
%28 = fcmp oeq double %27, 4.000000e+00
%29 = zext i1 %28 to i32
%30 = call i32 @assert_or_panic(i32 %29)
%31 = load float, float* %10
%32 = fpext float %31 to double
%33 = fcmp oeq double %32, 5.000000e+00
%34 = zext i1 %33 to i32
%35 = call i32 @assert_or_panic(i32 %34)
ret void
}

LLVM IR (-O2):
define void @c_five_floats(float %0, float %1, float %2, float %3, float %4) {
%6 = fcmp oeq float %0, 1.000000e+00
%7 = zext i1 %6 to i32
%8 = tail call i32 @assert_or_panic(i32 %7)
%9 = fcmp oeq float %1, 2.000000e+00
%10 = zext i1 %9 to i32
%11 = tail call i32 @assert_or_panic(i32 %10)
%12 = fcmp oeq float %2, 3.000000e+00
%13 = zext i1 %12 to i32
%14 = tail call i32 @assert_or_panic(i32 %13)
%15 = fcmp oeq float %3, 4.000000e+00
%16 = zext i1 %15 to i32
%17 = tail call i32 @assert_or_panic(i32 %16)
%18 = fcmp oeq float %4, 5.000000e+00
%19 = zext i1 %18 to i32
%20 = tail call i32 @assert_or_panic(i32 %19)
ret void
}