#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(int);
void extern_call_func_with_args(int x1, int x2, int x3, int x4, int y1, int y2,
                                int y3, int y4, double f1, double f2, double f3,
                                double f4) {
  assert(x1 == 1 && x2 == 2 && x3 == 3 && x4 == 4 && y1 == 5 && y2 == 6 &&
         y3 == 7 && y4 == 8 && f1 == 10.0 && f2 == 20.0 && f3 == 30.0 &&
         f4 == 40.0);
}


x86 assembly (clang, -O0):
<extern_call_func_with_args>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9d,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
movsd  %xmm1,-0x28(%rbp)
movsd  %xmm2,-0x30(%rbp)
movsd  %xmm3,-0x38(%rbp)
xor    %eax,%eax
cmpl   $0x1,-0x4(%rbp)
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
xor    %eax,%eax
cmpl   $0x2,-0x8(%rbp)
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
xor    %eax,%eax
cmpl   $0x3,-0xc(%rbp)
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
xor    %eax,%eax
cmpl   $0x4,-0x10(%rbp)
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
xor    %eax,%eax
cmpl   $0x5,-0x14(%rbp)
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
xor    %eax,%eax
cmpl   $0x6,-0x18(%rbp)
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
xor    %eax,%eax
cmpl   $0x7,0x10(%rbp)
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
xor    %eax,%eax
cmpl   $0x8,0x18(%rbp)
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
movsd  -0x20(%rbp),%xmm0
xor    %eax,%eax
movsd  0xe33(%rip),%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
jp     1240 <extern_call_func_with_args+0x130>
movsd  -0x28(%rbp),%xmm0
xor    %eax,%eax
movsd  0xe19(%rip),%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
jp     1240 <extern_call_func_with_args+0x130>
movsd  -0x30(%rbp),%xmm0
xor    %eax,%eax
movsd  0xdff(%rip),%xmm1
ucomisd %xmm1,%xmm0
mov    %al,-0x39(%rbp)
jne    1240 <extern_call_func_with_args+0x130>
jp     1240 <extern_call_func_with_args+0x130>
movsd  -0x38(%rbp),%xmm0
movsd  0xde7(%rip),%xmm1
ucomisd %xmm1,%xmm0
sete   %al
setnp  %cl
and    %cl,%al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<extern_call_func_with_args>:
mov    0x10(%rsp),%r10d
mov    0x8(%rsp),%eax
xor    $0x1,%edi
xor    $0x2,%esi
or     %edi,%esi
xor    $0x3,%edx
xor    $0x4,%ecx
or     %edx,%ecx
or     %esi,%ecx
xor    $0x5,%r8d
xor    $0x6,%r9d
or     %r8d,%r9d
or     %ecx,%r9d
xor    $0x7,%eax
or     %r9d,%eax
xor    $0x8,%r10d
or     %eax,%r10d
sete   %al
ucomisd 0xeaf(%rip),%xmm0
setnp  %cl
sete   %dl
and    %cl,%dl
and    %al,%dl
ucomisd 0xea5(%rip),%xmm1
setnp  %al
sete   %cl
and    %al,%cl
ucomisd 0xe9d(%rip),%xmm2
setnp  %sil
sete   %al
and    %sil,%al
and    %cl,%al
and    %dl,%al
ucomisd 0xe8f(%rip),%xmm3
setnp  %cl
sete   %dl
and    %cl,%dl
and    %al,%dl
movzbl %dl,%edi
jmp    1030 <assert@plt>

LLVM IR (-O0):
define void @extern_call_func_with_args(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, double %8, double %9, double %10, double %11) {
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
store i32 %0, i32* %13
store i32 %1, i32* %14
store i32 %2, i32* %15
store i32 %3, i32* %16
store i32 %4, i32* %17
store i32 %5, i32* %18
store i32 %6, i32* %19
store i32 %7, i32* %20
store double %8, double* %21
store double %9, double* %22
store double %10, double* %23
store double %11, double* %24
%25 = load i32, i32* %13
%26 = icmp eq i32 %25, 1
br i1 %26, label %27, label %60
27: ; preds = %12
%28 = load i32, i32* %14
%29 = icmp eq i32 %28, 2
br i1 %29, label %30, label %60
30: ; preds = %27
%31 = load i32, i32* %15
%32 = icmp eq i32 %31, 3
br i1 %32, label %33, label %60
33: ; preds = %30
%34 = load i32, i32* %16
%35 = icmp eq i32 %34, 4
br i1 %35, label %36, label %60
36: ; preds = %33
%37 = load i32, i32* %17
%38 = icmp eq i32 %37, 5
br i1 %38, label %39, label %60
39: ; preds = %36
%40 = load i32, i32* %18
%41 = icmp eq i32 %40, 6
br i1 %41, label %42, label %60
42: ; preds = %39
%43 = load i32, i32* %19
%44 = icmp eq i32 %43, 7
br i1 %44, label %45, label %60
45: ; preds = %42
%46 = load i32, i32* %20
%47 = icmp eq i32 %46, 8
br i1 %47, label %48, label %60
48: ; preds = %45
%49 = load double, double* %21
%50 = fcmp oeq double %49, 1.000000e+01
br i1 %50, label %51, label %60
51: ; preds = %48
%52 = load double, double* %22
%53 = fcmp oeq double %52, 2.000000e+01
br i1 %53, label %54, label %60
54: ; preds = %51
%55 = load double, double* %23
%56 = fcmp oeq double %55, 3.000000e+01
br i1 %56, label %57, label %60
57: ; preds = %54
%58 = load double, double* %24
%59 = fcmp oeq double %58, 4.000000e+01
br label %60
60: ; preds = %57, %54, %51, %48, %45, %42, %39, %36, %33, %30, %27, %12
%61 = phi i1 [ false, %54 ], [ false, %51 ], [ false, %48 ], [ false, %45 ], [ false, %42 ], [ false, %39 ], [ false, %36 ], [ false, %33 ], [ false, %30 ], [ false, %27 ], [ false, %12 ], [ %59, %57 ]
%62 = zext i1 %61 to i32
%63 = call i32 @assert(i32 %62)
ret void
}

LLVM IR (-O2):
define void @extern_call_func_with_args(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, double %8, double %9, double %10, double %11) {
%13 = icmp eq i32 %0, 1
%14 = icmp eq i32 %1, 2
%15 = and i1 %13, %14
%16 = icmp eq i32 %2, 3
%17 = and i1 %15, %16
%18 = icmp eq i32 %3, 4
%19 = and i1 %17, %18
%20 = icmp eq i32 %4, 5
%21 = and i1 %19, %20
%22 = icmp eq i32 %5, 6
%23 = and i1 %21, %22
%24 = icmp eq i32 %6, 7
%25 = and i1 %23, %24
%26 = icmp eq i32 %7, 8
%27 = and i1 %25, %26
%28 = fcmp oeq double %8, 1.000000e+01
%29 = and i1 %27, %28
%30 = fcmp oeq double %9, 2.000000e+01
%31 = and i1 %29, %30
%32 = fcmp oeq double %10, 3.000000e+01
%33 = and i1 %31, %32
%34 = fcmp oeq double %11, 4.000000e+01
%35 = and i1 %33, %34
%36 = zext i1 %35 to i32
%37 = tail call i32 @assert(i32 %36)
ret void
}