#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 */
struct vec2i {
  int dummy;
};
typedef int /*<<< orphan*/ int32_t;

/* Variables and functions */
int /*<<< orphan*/ vec2i_bezier4(int /*<<< orphan*/ *, int /*<<< orphan*/ *,
                                 int /*<<< orphan*/ *, int /*<<< orphan*/ *,
                                 int /*<<< orphan*/ *, float);
__attribute__((always_)) struct vec2i *
psvec2i_bezier4(struct vec2i *result, struct vec2i *a, struct vec2i *b,
                struct vec2i *c, struct vec2i *d, float p) {
  vec2i_bezier4((int32_t *)result, (int32_t *)a, (int32_t *)b, (int32_t *)c,
                (int32_t *)d, p);
  return result;
}


x86 assembly (clang, -O0):
<psvec2i_bezier4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movss  %xmm0,-0x2c(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    -0x20(%rbp),%rcx
mov    -0x28(%rbp),%r8
movss  -0x2c(%rbp),%xmm0
call   1030 <vec2i_bezier4@plt>
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<psvec2i_bezier4>:
push   %rbx
mov    %rdi,%rbx
call   1030 <vec2i_bezier4@plt>
mov    %rbx,%rax
pop    %rbx
ret

LLVM IR (-O0):
%struct.vec2i = type { i32 }
define %struct.vec2i* @psvec2i_bezier4(%struct.vec2i* %0, %struct.vec2i* %1, %struct.vec2i* %2, %struct.vec2i* %3, %struct.vec2i* %4, float %5) {
%7 = alloca %struct.vec2i*
%8 = alloca %struct.vec2i*
%9 = alloca %struct.vec2i*
%10 = alloca %struct.vec2i*
%11 = alloca %struct.vec2i*
%12 = alloca float
store %struct.vec2i* %0, %struct.vec2i** %7
store %struct.vec2i* %1, %struct.vec2i** %8
store %struct.vec2i* %2, %struct.vec2i** %9
store %struct.vec2i* %3, %struct.vec2i** %10
store %struct.vec2i* %4, %struct.vec2i** %11
store float %5, float* %12
%13 = load %struct.vec2i*, %struct.vec2i** %7
%14 = bitcast %struct.vec2i* %13 to i32*
%15 = load %struct.vec2i*, %struct.vec2i** %8
%16 = bitcast %struct.vec2i* %15 to i32*
%17 = load %struct.vec2i*, %struct.vec2i** %9
%18 = bitcast %struct.vec2i* %17 to i32*
%19 = load %struct.vec2i*, %struct.vec2i** %10
%20 = bitcast %struct.vec2i* %19 to i32*
%21 = load %struct.vec2i*, %struct.vec2i** %11
%22 = bitcast %struct.vec2i* %21 to i32*
%23 = load float, float* %12
%24 = call i32 @vec2i_bezier4(i32* %14, i32* %16, i32* %18, i32* %20, i32* %22, float %23)
%25 = load %struct.vec2i*, %struct.vec2i** %7
ret %struct.vec2i* %25
}

LLVM IR (-O2):
%struct.vec2i = type { i32 }
define %struct.vec2i* @psvec2i_bezier4(%struct.vec2i* returned %0, %struct.vec2i* %1, %struct.vec2i* %2, %struct.vec2i* %3, %struct.vec2i* %4, float %5) {
%7 = getelementptr %struct.vec2i, %struct.vec2i* %0, i64 0, i32 0
%8 = getelementptr %struct.vec2i, %struct.vec2i* %1, i64 0, i32 0
%9 = getelementptr %struct.vec2i, %struct.vec2i* %2, i64 0, i32 0
%10 = getelementptr %struct.vec2i, %struct.vec2i* %3, i64 0, i32 0
%11 = getelementptr %struct.vec2i, %struct.vec2i* %4, i64 0, i32 0
%12 = tail call i32 @vec2i_bezier4(i32* %7, i32* %8, i32* %9, i32* %10, i32* %11, float %5)
ret %struct.vec2i* %0
}