long long int Factorial(int input, int cas) {
  long long int result = 1;
  if (cas)
    while (input > 0) {
      result *= input;
      input--;
    }
  else
    while (input > 0) {
      result *= input;
      input -= 2;
    }
  return result;
}


x86 assembly (clang, -O0):
<Factorial>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
movq   $0x1,-0x10(%rbp)
cmpl   $0x0,-0x8(%rbp)
je     114b <Factorial+0x4b>
jmp    1121 <Factorial+0x21>
cmpl   $0x0,-0x4(%rbp)
jle    1146 <Factorial+0x46>
movslq -0x4(%rbp),%rax
imul   -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
jmp    1121 <Factorial+0x21>
jmp    117a <Factorial+0x7a>
jmp    1150 <Factorial+0x50>
cmpl   $0x0,-0x4(%rbp)
jle    1175 <Factorial+0x75>
movslq -0x4(%rbp),%rax
imul   -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x4(%rbp)
jmp    1150 <Factorial+0x50>
jmp    117a <Factorial+0x7a>
mov    -0x10(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<Factorial>:
test   %esi,%esi
je     112e <Factorial+0x2e>
test   %edi,%edi
jle    1155 <Factorial+0x55>
mov    %edi,%ecx
lea    -0x1(%rcx),%rax
mov    %ecx,%r9d
and    $0x7,%r9d
cmp    $0x7,%rax
jae    115b <Factorial+0x5b>
mov    $0x1,%eax
test   %r9,%r9
jne    11e0 <Factorial+0xe0>
jmp    11ee <Factorial+0xee>
test   %edi,%edi
jle    1155 <Factorial+0x55>
mov    %edi,%ecx
mov    $0x1,%eax
nopl   0x0(%rax)
imul   %rcx,%rax
add    $0xfffffffffffffffe,%rcx
lea    0x2(%rcx),%edx
cmp    $0x2,%edx
ja     1140 <Factorial+0x40>
jmp    11ee <Factorial+0xee>
mov    $0x1,%eax
ret
mov    %ecx,%r8d
and    $0xfffffff8,%r8d
neg    %r8
mov    $0x1,%eax
xor    %edi,%edi
nopl   0x0(%rax)
lea    (%rcx,%rdi,1),%rsi
imul   %rax,%rsi
lea    (%rcx,%rdi,1),%rax
add    $0xffffffffffffffff,%rax
lea    (%rcx,%rdi,1),%rdx
add    $0xfffffffffffffffe,%rdx
imul   %rax,%rdx
imul   %rsi,%rdx
lea    (%rcx,%rdi,1),%rsi
add    $0xfffffffffffffffd,%rsi
lea    (%rcx,%rdi,1),%rax
add    $0xfffffffffffffffc,%rax
imul   %rsi,%rax
lea    (%rcx,%rdi,1),%rsi
add    $0xfffffffffffffffb,%rsi
imul   %rax,%rsi
imul   %rdx,%rsi
lea    (%rcx,%rdi,1),%rdx
add    $0xfffffffffffffffa,%rdx
lea    (%rcx,%rdi,1),%rax
add    $0xfffffffffffffff9,%rax
imul   %rdx,%rax
imul   %rsi,%rax
add    $0xfffffffffffffff8,%rdi
cmp    %rdi,%r8
jne    1170 <Factorial+0x70>
add    %rdi,%rcx
test   %r9,%r9
je     11ee <Factorial+0xee>
nopl   (%rax)
imul   %rcx,%rax
add    $0xffffffffffffffff,%rcx
add    $0xffffffffffffffff,%r9
jne    11e0 <Factorial+0xe0>
ret

LLVM IR (-O0):
define i64 @Factorial(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i64
store i32 %0, i32* %3
store i32 %1, i32* %4
store i64 1, i64* %5
%6 = load i32, i32* %4
%7 = icmp ne i32 %6, 0
br i1 %7, label %8, label %20
8: ; preds = %2
br label %9
9: ; preds = %12, %8
%10 = load i32, i32* %3
%11 = icmp sgt i32 %10, 0
br i1 %11, label %12, label %19
12: ; preds = %9
%13 = load i32, i32* %3
%14 = sext i32 %13 to i64
%15 = load i64, i64* %5
%16 = mul nsw i64 %15, %14
store i64 %16, i64* %5
%17 = load i32, i32* %3
%18 = add nsw i32 %17, -1
store i32 %18, i32* %3
br label %9
19: ; preds = %9
br label %32
20: ; preds = %2
br label %21
21: ; preds = %24, %20
%22 = load i32, i32* %3
%23 = icmp sgt i32 %22, 0
br i1 %23, label %24, label %31
24: ; preds = %21
%25 = load i32, i32* %3
%26 = sext i32 %25 to i64
%27 = load i64, i64* %5
%28 = mul nsw i64 %27, %26
store i64 %28, i64* %5
%29 = load i32, i32* %3
%30 = sub nsw i32 %29, 2
store i32 %30, i32* %3
br label %21
31: ; preds = %21
br label %32
32: ; preds = %31, %19
%33 = load i64, i64* %5
ret i64 %33
}

LLVM IR (-O2):
define i64 @Factorial(i32 %0, i32 %1) {
%3 = icmp eq i32 %1, 0
%4 = icmp sgt i32 %0, 0
br i1 %3, label %13, label %5
5: ; preds = %2
br i1 %4, label %6, label %56
6: ; preds = %5
%7 = zext i32 %0 to i64
%8 = add nsw i64 %7, -1
%9 = and i64 %7, 7
%10 = icmp ult i64 %8, 7
br i1 %10, label %43, label %11
11: ; preds = %6
%12 = and i64 %7, 4294967288
br label %14
13: ; preds = %2
br i1 %4, label %36, label %56
14: ; preds = %14, %11
%15 = phi i64 [ %7, %11 ], [ %33, %14 ]
%16 = phi i64 [ 1, %11 ], [ %32, %14 ]
%17 = phi i64 [ 0, %11 ], [ %34, %14 ]
%18 = mul nsw i64 %16, %15
%19 = add nsw i64 %15, -1
%20 = mul nsw i64 %18, %19
%21 = add nsw i64 %15, -2
%22 = mul nsw i64 %20, %21
%23 = add nsw i64 %15, -3
%24 = mul nsw i64 %22, %23
%25 = add nsw i64 %15, -4
%26 = mul nsw i64 %24, %25
%27 = add nsw i64 %15, -5
%28 = mul nsw i64 %26, %27
%29 = add nsw i64 %15, -6
%30 = mul nsw i64 %28, %29
%31 = add nsw i64 %15, -7
%32 = mul nsw i64 %30, %31
%33 = add nsw i64 %15, -8
%34 = add i64 %17, 8
%35 = icmp eq i64 %34, %12
br i1 %35, label %43, label %14
36: ; preds = %13, %36
%37 = phi i64 [ %40, %36 ], [ 1, %13 ]
%38 = phi i32 [ %41, %36 ], [ %0, %13 ]
%39 = zext i32 %38 to i64
%40 = mul nsw i64 %37, %39
%41 = add nsw i32 %38, -2
%42 = icmp ugt i32 %38, 2
br i1 %42, label %36, label %56
43: ; preds = %14, %6
%44 = phi i64 [ undef, %6 ], [ %32, %14 ]
%45 = phi i64 [ %7, %6 ], [ %33, %14 ]
%46 = phi i64 [ 1, %6 ], [ %32, %14 ]
%47 = icmp eq i64 %9, 0
br i1 %47, label %56, label %48
48: ; preds = %43, %48
%49 = phi i64 [ %53, %48 ], [ %45, %43 ]
%50 = phi i64 [ %52, %48 ], [ %46, %43 ]
%51 = phi i64 [ %54, %48 ], [ 0, %43 ]
%52 = mul nsw i64 %50, %49
%53 = add nsw i64 %49, -1
%54 = add i64 %51, 1
%55 = icmp eq i64 %54, %9
br i1 %55, label %56, label %48
56: ; preds = %43, %48, %36, %5, %13
%57 = phi i64 [ 1, %13 ], [ 1, %5 ], [ %40, %36 ], [ %44, %43 ], [ %52, %48 ]
ret i64 %57
}