#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 */
void glmClamp3fv(float out[3], const float x[3], const float minVal[3],
                 const float maxVal[3]) {
  for (size_t i = 0; i < 3; ++i) {
    if (x[i] <= minVal[i]) {
      out[i] = minVal[i];
    } else if (x[i] >= maxVal[i]) {
      out[i] = maxVal[i];
    } else {
      out[i] = x[i];
    }
  }
}


x86 assembly (clang, -O0):
<glmClamp3fv>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
cmpq   $0x3,-0x28(%rbp)
jae    11dc <glmClamp3fv+0xdc>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss %xmm1,%xmm0
jb     1169 <glmClamp3fv+0x69>
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    11c6 <glmClamp3fv+0xc6>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%rcx
ucomiss (%rax,%rcx,4),%xmm0
jb     11a7 <glmClamp3fv+0xa7>
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    11c1 <glmClamp3fv+0xc1>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    11c6 <glmClamp3fv+0xc6>
jmp    11cb <glmClamp3fv+0xcb>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    111c <glmClamp3fv+0x1c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<glmClamp3fv>:
movss  (%rsi),%xmm1
movss  (%rdx),%xmm0
ucomiss %xmm1,%xmm0
jae    1122 <glmClamp3fv+0x22>
movss  (%rcx),%xmm2
movaps %xmm2,%xmm0
cmpless %xmm1,%xmm0
andps  %xmm0,%xmm2
andnps %xmm1,%xmm0
orps   %xmm2,%xmm0
movss  %xmm0,(%rdi)
movss  0x4(%rsi),%xmm0
movss  0x4(%rdx),%xmm1
ucomiss %xmm0,%xmm1
jae    1146 <glmClamp3fv+0x46>
movss  0x4(%rcx),%xmm1
ucomiss %xmm1,%xmm0
jae    1146 <glmClamp3fv+0x46>
movss  %xmm0,0x4(%rdi)
jmp    114b <glmClamp3fv+0x4b>
movss  %xmm1,0x4(%rdi)
movss  0x8(%rsi),%xmm0
movss  0x8(%rdx),%xmm1
ucomiss %xmm0,%xmm1
jae    116a <glmClamp3fv+0x6a>
movss  0x8(%rcx),%xmm1
ucomiss %xmm1,%xmm0
jae    116a <glmClamp3fv+0x6a>
movss  %xmm0,0x8(%rdi)
ret
movss  %xmm1,0x8(%rdi)
ret

LLVM IR (-O0):
define void @glmClamp3fv(float* %0, float* %1, float* %2, float* %3) {
%5 = alloca float*
%6 = alloca float*
%7 = alloca float*
%8 = alloca float*
%9 = alloca i64
store float* %0, float** %5
store float* %1, float** %6
store float* %2, float** %7
store float* %3, float** %8
store i64 0, i64* %9
br label %10
10: ; preds = %59, %4
%11 = load i64, i64* %9
%12 = icmp ult i64 %11, 3
br i1 %12, label %13, label %62
13: ; preds = %10
%14 = load float*, float** %6
%15 = load i64, i64* %9
%16 = getelementptr inbounds float, float* %14, i64 %15
%17 = load float, float* %16
%18 = load float*, float** %7
%19 = load i64, i64* %9
%20 = getelementptr inbounds float, float* %18, i64 %19
%21 = load float, float* %20
%22 = fcmp ole float %17, %21
br i1 %22, label %23, label %31
23: ; preds = %13
%24 = load float*, float** %7
%25 = load i64, i64* %9
%26 = getelementptr inbounds float, float* %24, i64 %25
%27 = load float, float* %26
%28 = load float*, float** %5
%29 = load i64, i64* %9
%30 = getelementptr inbounds float, float* %28, i64 %29
store float %27, float* %30
br label %58
31: ; preds = %13
%32 = load float*, float** %6
%33 = load i64, i64* %9
%34 = getelementptr inbounds float, float* %32, i64 %33
%35 = load float, float* %34
%36 = load float*, float** %8
%37 = load i64, i64* %9
%38 = getelementptr inbounds float, float* %36, i64 %37
%39 = load float, float* %38
%40 = fcmp oge float %35, %39
br i1 %40, label %41, label %49
41: ; preds = %31
%42 = load float*, float** %8
%43 = load i64, i64* %9
%44 = getelementptr inbounds float, float* %42, i64 %43
%45 = load float, float* %44
%46 = load float*, float** %5
%47 = load i64, i64* %9
%48 = getelementptr inbounds float, float* %46, i64 %47
store float %45, float* %48
br label %57
49: ; preds = %31
%50 = load float*, float** %6
%51 = load i64, i64* %9
%52 = getelementptr inbounds float, float* %50, i64 %51
%53 = load float, float* %52
%54 = load float*, float** %5
%55 = load i64, i64* %9
%56 = getelementptr inbounds float, float* %54, i64 %55
store float %53, float* %56
br label %57
57: ; preds = %49, %41
br label %58
58: ; preds = %57, %23
br label %59
59: ; preds = %58
%60 = load i64, i64* %9
%61 = add i64 %60, 1
store i64 %61, i64* %9
br label %10
62: ; preds = %10
ret void
}

LLVM IR (-O2):
define void @glmClamp3fv(float* nocapture writeonly %0, float* nocapture %1, float* nocapture %2, float* nocapture %3) {
%5 = load float, float* %1
%6 = load float, float* %2
%7 = fcmp ugt float %5, %6
br i1 %7, label %8, label %12
8: ; preds = %4
%9 = load float, float* %3
%10 = fcmp oge float %5, %9
%11 = select i1 %10, float %9, float %5
br label %12
12: ; preds = %8, %4
%13 = phi float [ %6, %4 ], [ %11, %8 ]
store float %13, float* %0
%14 = getelementptr inbounds float, float* %1, i64 1
%15 = load float, float* %14
%16 = getelementptr inbounds float, float* %2, i64 1
%17 = load float, float* %16
%18 = fcmp ugt float %15, %17
br i1 %18, label %21, label %19
19: ; preds = %12
%20 = getelementptr inbounds float, float* %0, i64 1
store float %17, float* %20
br label %28
21: ; preds = %12
%22 = getelementptr inbounds float, float* %3, i64 1
%23 = load float, float* %22
%24 = fcmp ult float %15, %23
%25 = getelementptr inbounds float, float* %0, i64 1
br i1 %24, label %27, label %26
26: ; preds = %21
store float %23, float* %25
br label %28
27: ; preds = %21
store float %15, float* %25
br label %28
28: ; preds = %27, %26, %19
%29 = getelementptr inbounds float, float* %1, i64 2
%30 = load float, float* %29
%31 = getelementptr inbounds float, float* %2, i64 2
%32 = load float, float* %31
%33 = fcmp ugt float %30, %32
br i1 %33, label %36, label %34
34: ; preds = %28
%35 = getelementptr inbounds float, float* %0, i64 2
store float %32, float* %35
br label %43
36: ; preds = %28
%37 = getelementptr inbounds float, float* %3, i64 2
%38 = load float, float* %37
%39 = fcmp ult float %30, %38
%40 = getelementptr inbounds float, float* %0, i64 2
br i1 %39, label %42, label %41
41: ; preds = %36
store float %38, float* %40
br label %43
42: ; preds = %36
store float %30, float* %40
br label %43
43: ; preds = %42, %41, %34
ret void
}