#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 */
typedef scalar_t__ int32_t;

/* Variables and functions */
extern int32_t oosmos_AnalogMapFast(int32_t Value, int32_t InMin, int32_t InMax,
                                    int32_t OutMin, int32_t OutMax) {
  return (
      (((Value - InMin) * ((OutMax + 1) - OutMin) / ((InMax + 1) - InMin) +
        OutMin) < (OutMax))
          ? ((Value - InMin) * ((OutMax + 1) - OutMin) / ((InMax + 1) - InMin) +
             OutMin)
          : (OutMax));
}


x86 assembly (clang, -O0):
<oosmos_AnalogMapFast>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x8(%rbp),%rax
sub    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
sub    -0x20(%rbp),%rcx
imul   %rcx,%rax
mov    -0x18(%rbp),%rcx
add    $0x1,%rcx
sub    -0x10(%rbp),%rcx
cqto
idiv   %rcx
add    -0x20(%rbp),%rax
cmp    -0x28(%rbp),%rax
jge    1185 <oosmos_AnalogMapFast+0x85>
mov    -0x8(%rbp),%rax
sub    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
sub    -0x20(%rbp),%rcx
imul   %rcx,%rax
mov    -0x18(%rbp),%rcx
add    $0x1,%rcx
sub    -0x10(%rbp),%rcx
cqto
idiv   %rcx
add    -0x20(%rbp),%rax
mov    %rax,-0x30(%rbp)
jmp    118d <oosmos_AnalogMapFast+0x8d>
mov    -0x28(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<oosmos_AnalogMapFast>:
mov    %rdx,%r9
sub    %rsi,%rdi
mov    %r8,%rax
sub    %rcx,%rax
add    $0x1,%rax
imul   %rdi,%rax
sub    %rsi,%r9
add    $0x1,%r9
mov    %rax,%rdx
or     %r9,%rdx
shr    $0x20,%rdx
je     112e <oosmos_AnalogMapFast+0x2e>
cqto
idiv   %r9
jmp    1133 <oosmos_AnalogMapFast+0x33>
xor    %edx,%edx
div    %r9d
add    %rcx,%rax
cmp    %r8,%rax
cmovge %r8,%rax
ret

LLVM IR (-O0):
define i64 @oosmos_AnalogMapFast(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4) {
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
store i64 %0, i64* %6
store i64 %1, i64* %7
store i64 %2, i64* %8
store i64 %3, i64* %9
store i64 %4, i64* %10
%11 = load i64, i64* %6
%12 = load i64, i64* %7
%13 = sub nsw i64 %11, %12
%14 = load i64, i64* %10
%15 = add nsw i64 %14, 1
%16 = load i64, i64* %9
%17 = sub nsw i64 %15, %16
%18 = mul nsw i64 %13, %17
%19 = load i64, i64* %8
%20 = add nsw i64 %19, 1
%21 = load i64, i64* %7
%22 = sub nsw i64 %20, %21
%23 = sdiv i64 %18, %22
%24 = load i64, i64* %9
%25 = add nsw i64 %23, %24
%26 = load i64, i64* %10
%27 = icmp slt i64 %25, %26
br i1 %27, label %28, label %44
28: ; preds = %5
%29 = load i64, i64* %6
%30 = load i64, i64* %7
%31 = sub nsw i64 %29, %30
%32 = load i64, i64* %10
%33 = add nsw i64 %32, 1
%34 = load i64, i64* %9
%35 = sub nsw i64 %33, %34
%36 = mul nsw i64 %31, %35
%37 = load i64, i64* %8
%38 = add nsw i64 %37, 1
%39 = load i64, i64* %7
%40 = sub nsw i64 %38, %39
%41 = sdiv i64 %36, %40
%42 = load i64, i64* %9
%43 = add nsw i64 %41, %42
br label %46
44: ; preds = %5
%45 = load i64, i64* %10
br label %46
46: ; preds = %44, %28
%47 = phi i64 [ %43, %28 ], [ %45, %44 ]
ret i64 %47
}

LLVM IR (-O2):
define i64 @oosmos_AnalogMapFast(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4) {
%6 = sub nsw i64 %0, %1
%7 = sub i64 1, %3
%8 = add i64 %7, %4
%9 = mul nsw i64 %8, %6
%10 = sub i64 1, %1
%11 = add i64 %10, %2
%12 = sdiv i64 %9, %11
%13 = add nsw i64 %12, %3
%14 = icmp slt i64 %13, %4
%15 = select i1 %14, i64 %13, i64 %4
ret i64 %15
}