void get_clamped_min_max(int a, int b, int c, const int clamp_min,
                         const int clamp_max, int *min, int *max) {
  if (a > b) {
    int tmp = a;
    a = b;
    b = tmp;
  }
  if (b > c) {
    int tmp = b;
    b = c;
    c = tmp;
  }
  if (a > b) {
    a = b;
  }
  *min = (clamp_min > a) ? clamp_min : a;
  *max = (clamp_max < c) ? clamp_max : c;
}


x86 assembly (clang, -O0):
<get_clamped_min_max>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9,-0x20(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    113a <get_clamped_min_max+0x3a>
mov    -0x4(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0xc(%rbp),%eax
jle    1158 <get_clamped_min_max+0x58>
mov    -0x8(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    116a <get_clamped_min_max+0x6a>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0x4(%rbp),%eax
jle    1181 <get_clamped_min_max+0x81>
mov    -0x10(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    1187 <get_clamped_min_max+0x87>
mov    -0x4(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11a7 <get_clamped_min_max+0xa7>
mov    -0x14(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    11ad <get_clamped_min_max+0xad>
mov    -0xc(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%ecx
mov    0x10(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_clamped_min_max>:
cmp    %esi,%edi
mov    %esi,%eax
cmovg  %edi,%eax
cmovg  %esi,%edi
cmp    %edx,%eax
mov    %edx,%esi
cmovg  %eax,%esi
cmovg  %edx,%eax
mov    0x8(%rsp),%rdx
cmp    %eax,%edi
cmovle %edi,%eax
cmp    %ecx,%eax
cmovl  %ecx,%eax
mov    %eax,(%r9)
cmp    %r8d,%esi
cmovg  %r8d,%esi
mov    %esi,(%rdx)
ret

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

LLVM IR (-O2):
define void @get_clamped_min_max(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32* nocapture writeonly %5, i32* nocapture writeonly %6) {
%8 = icmp sgt i32 %0, %1
%9 = select i1 %8, i32 %0, i32 %1
%10 = select i1 %8, i32 %1, i32 %0
%11 = icmp sgt i32 %9, %2
%12 = select i1 %11, i32 %9, i32 %2
%13 = select i1 %11, i32 %2, i32 %9
%14 = icmp sgt i32 %10, %13
%15 = select i1 %14, i32 %13, i32 %10
%16 = icmp slt i32 %15, %3
%17 = select i1 %16, i32 %3, i32 %15
store i32 %17, i32* %5
%18 = icmp sgt i32 %12, %4
%19 = select i1 %18, i32 %4, i32 %12
store i32 %19, i32* %6
ret void
}