int pascal(int n, int r) {
  int i;
  int x;
  if (n < 0 || r < 0 || r > n)
    return 1;
  x = 1;
  for (i = n; i > (n - r); i--)
    x *= i;
  for (; r > 1; r--)
    x /= r;
  return x;
}


x86 assembly (clang, -O0):
<pascal>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
cmpl   $0x0,-0x8(%rbp)
jl     112a <pascal+0x2a>
cmpl   $0x0,-0xc(%rbp)
jl     112a <pascal+0x2a>
mov    -0xc(%rbp),%eax
cmp    -0x8(%rbp),%eax
jle    1136 <pascal+0x36>
movl   $0x1,-0x4(%rbp)
jmp    119b <pascal+0x9b>
movl   $0x1,-0x14(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    -0xc(%rbp),%ecx
cmp    %ecx,%eax
jle    116c <pascal+0x6c>
mov    -0x10(%rbp),%eax
imul   -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x10(%rbp)
jmp    1143 <pascal+0x43>
jmp    1171 <pascal+0x71>
cmpl   $0x1,-0xc(%rbp)
jle    1195 <pascal+0x95>
mov    -0xc(%rbp),%ecx
mov    -0x14(%rbp),%eax
cltd
idiv   %ecx
mov    %eax,-0x14(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
jmp    1171 <pascal+0x71>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<pascal>:
mov    %edi,%ecx
mov    $0x1,%eax
sub    %esi,%ecx
jl     137d <pascal+0x27d>
mov    %esi,%edx
or     %edi,%edx
js     137d <pascal+0x27d>
test   %esi,%esi
jle    137d <pascal+0x27d>
lea    -0x1(%rdi),%eax
cmp    %eax,%ecx
cmovl  %ecx,%eax
mov    %edi,%r9d
sub    %eax,%r9d
mov    $0x1,%eax
cmp    $0x8,%r9d
jb     1360 <pascal+0x260>
mov    %r9d,%r8d
and    $0xfffffff8,%r8d
movd   %edi,%xmm0
pshufd $0x0,%xmm0,%xmm6
paddd  0xeaa(%rip),%xmm6
lea    -0x8(%r8),%r10d
mov    %r10d,%eax
shr    $0x3,%eax
add    $0x1,%eax
mov    %eax,%edx
and    $0x3,%edx
cmp    $0x18,%r10d
jae    117f <pascal+0x7f>
movdqa 0xe9a(%rip),%xmm1
movdqa %xmm1,%xmm2
jmp    12b1 <pascal+0x1b1>
and    $0xfffffffc,%eax
movdqa 0xe86(%rip),%xmm1
movdqa 0xe9d(%rip),%xmm9
movdqa 0xea4(%rip),%xmm10
movdqa 0xeab(%rip),%xmm11
movdqa 0xeb2(%rip),%xmm12
movdqa 0xeb9(%rip),%xmm13
movdqa 0xec0(%rip),%xmm14
movdqa 0xec7(%rip),%xmm15
movdqa %xmm1,%xmm2
nopl   (%rax)
movdqa %xmm6,%xmm0
paddd  0xe44(%rip),%xmm0
pshufd $0xf5,%xmm6,%xmm7
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm7,%xmm3
pmuludq %xmm6,%xmm1
pshufd $0xf5,%xmm2,%xmm7
pshufd $0xf5,%xmm0,%xmm4
pmuludq %xmm7,%xmm4
pmuludq %xmm2,%xmm0
movdqa %xmm6,%xmm2
paddd  %xmm9,%xmm2
movdqa %xmm6,%xmm7
paddd  %xmm10,%xmm7
pmuludq %xmm2,%xmm1
pshufd $0xf5,%xmm2,%xmm2
pmuludq %xmm3,%xmm2
pmuludq %xmm7,%xmm0
pshufd $0xf5,%xmm7,%xmm3
pmuludq %xmm4,%xmm3
movdqa %xmm6,%xmm4
paddd  %xmm11,%xmm4
movdqa %xmm6,%xmm7
paddd  %xmm12,%xmm7
pshufd $0xf5,%xmm4,%xmm5
pmuludq %xmm2,%xmm5
pmuludq %xmm1,%xmm4
pshufd $0xf5,%xmm7,%xmm8
pmuludq %xmm3,%xmm8
pmuludq %xmm0,%xmm7
movdqa %xmm6,%xmm0
paddd  %xmm13,%xmm0
movdqa %xmm6,%xmm3
paddd  %xmm14,%xmm3
pmuludq %xmm0,%xmm4
pshufd $0xe8,%xmm4,%xmm1
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm5,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm1
pmuludq %xmm3,%xmm7
pshufd $0xe8,%xmm7,%xmm2
pshufd $0xf5,%xmm3,%xmm0
pmuludq %xmm8,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
paddd  %xmm15,%xmm6
add    $0xfffffffc,%eax
jne    11d0 <pascal+0xd0>
test   %edx,%edx
je     1321 <pascal+0x221>
movdqa 0xd63(%rip),%xmm3
movdqa 0xd6b(%rip),%xmm4
cs nopw 0x0(%rax,%rax,1)
nop
movdqa %xmm6,%xmm0
paddd  %xmm3,%xmm0
pshufd $0xf5,%xmm1,%xmm5
pmuludq %xmm6,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pshufd $0xf5,%xmm6,%xmm7
pmuludq %xmm5,%xmm7
pshufd $0xe8,%xmm7,%xmm5
punpckldq %xmm5,%xmm1
pshufd $0xf5,%xmm2,%xmm5
pmuludq %xmm0,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm5,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm2
paddd  %xmm4,%xmm6
add    $0xffffffff,%edx
jne    12d0 <pascal+0x1d0>
pshufd $0xf5,%xmm1,%xmm0
pshufd $0xf5,%xmm2,%xmm3
pmuludq %xmm0,%xmm3
pmuludq %xmm1,%xmm2
pshufd $0xee,%xmm2,%xmm0
pmuludq %xmm2,%xmm0
pshufd $0xaa,%xmm3,%xmm1
pmuludq %xmm3,%xmm1
pmuludq %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r8d,%r9d
je     136a <pascal+0x26a>
sub    %r8d,%edi
cs nopw 0x0(%rax,%rax,1)
nop
imul   %edi,%eax
add    $0xffffffff,%edi
cmp    %ecx,%edi
jg     1360 <pascal+0x260>
cmp    $0x2,%esi
jl     137d <pascal+0x27d>
nop
cltd
idiv   %esi
lea    -0x1(%rsi),%ecx
cmp    $0x2,%esi
mov    %ecx,%esi
ja     1370 <pascal+0x270>
ret

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

LLVM IR (-O2):
define i32 @pascal(i32 %0, i32 %1) {
%3 = or i32 %1, %0
%4 = icmp slt i32 %3, 0
%5 = icmp slt i32 %0, %1
%6 = or i1 %5, %4
br i1 %6, label %93, label %7
7: ; preds = %2
%8 = sub i32 %0, %1
%9 = icmp sgt i32 %1, 0
br i1 %9, label %10, label %93
10: ; preds = %7
%11 = add i32 %0, -1
%12 = call i32 @llvm.smin.i32(i32 %8, i32 %11)
%13 = sub i32 %0, %12
%14 = icmp ult i32 %13, 8
br i1 %14, label %75, label %15
15: ; preds = %10
%16 = and i32 %13, -8
%17 = sub i32 %0, %16
%18 = insertelement <4 x i32> poison, i32 %0, i64 0
%19 = shufflevector <4 x i32> %18, <4 x i32> poison, <4 x i32> zeroinitializer
%20 = add <4 x i32> %19, <i32 0, i32 -1, i32 -2, i32 -3>
%21 = add i32 %16, -8
%22 = lshr exact i32 %21, 3
%23 = add nuw nsw i32 %22, 1
%24 = and i32 %23, 3
%25 = icmp ult i32 %21, 24
br i1 %25, label %51, label %26
26: ; preds = %15
%27 = and i32 %23, 1073741820
br label %28
28: ; preds = %28, %26
%29 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %26 ], [ %46, %28 ]
%30 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %26 ], [ %47, %28 ]
%31 = phi <4 x i32> [ %20, %26 ], [ %48, %28 ]
%32 = phi i32 [ 0, %26 ], [ %49, %28 ]
%33 = add <4 x i32> %31, <i32 -4, i32 -4, i32 -4, i32 -4>
%34 = mul <4 x i32> %29, %31
%35 = mul <4 x i32> %30, %33
%36 = add <4 x i32> %31, <i32 -8, i32 -8, i32 -8, i32 -8>
%37 = add <4 x i32> %31, <i32 -12, i32 -12, i32 -12, i32 -12>
%38 = mul <4 x i32> %34, %36
%39 = mul <4 x i32> %35, %37
%40 = add <4 x i32> %31, <i32 -16, i32 -16, i32 -16, i32 -16>
%41 = add <4 x i32> %31, <i32 -20, i32 -20, i32 -20, i32 -20>
%42 = mul <4 x i32> %38, %40
%43 = mul <4 x i32> %39, %41
%44 = add <4 x i32> %31, <i32 -24, i32 -24, i32 -24, i32 -24>
%45 = add <4 x i32> %31, <i32 -28, i32 -28, i32 -28, i32 -28>
%46 = mul <4 x i32> %42, %44
%47 = mul <4 x i32> %43, %45
%48 = add <4 x i32> %31, <i32 -32, i32 -32, i32 -32, i32 -32>
%49 = add i32 %32, 4
%50 = icmp eq i32 %49, %27
br i1 %50, label %51, label %28
51: ; preds = %28, %15
%52 = phi <4 x i32> [ undef, %15 ], [ %46, %28 ]
%53 = phi <4 x i32> [ undef, %15 ], [ %47, %28 ]
%54 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %15 ], [ %46, %28 ]
%55 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %15 ], [ %47, %28 ]
%56 = phi <4 x i32> [ %20, %15 ], [ %48, %28 ]
%57 = icmp eq i32 %24, 0
br i1 %57, label %69, label %58
58: ; preds = %51, %58
%59 = phi <4 x i32> [ %64, %58 ], [ %54, %51 ]
%60 = phi <4 x i32> [ %65, %58 ], [ %55, %51 ]
%61 = phi <4 x i32> [ %66, %58 ], [ %56, %51 ]
%62 = phi i32 [ %67, %58 ], [ 0, %51 ]
%63 = add <4 x i32> %61, <i32 -4, i32 -4, i32 -4, i32 -4>
%64 = mul <4 x i32> %59, %61
%65 = mul <4 x i32> %60, %63
%66 = add <4 x i32> %61, <i32 -8, i32 -8, i32 -8, i32 -8>
%67 = add i32 %62, 1
%68 = icmp eq i32 %67, %24
br i1 %68, label %69, label %58
69: ; preds = %58, %51
%70 = phi <4 x i32> [ %52, %51 ], [ %64, %58 ]
%71 = phi <4 x i32> [ %53, %51 ], [ %65, %58 ]
%72 = mul <4 x i32> %71, %70
%73 = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %72)
%74 = icmp eq i32 %13, %16
br i1 %74, label %78, label %75
75: ; preds = %10, %69
%76 = phi i32 [ 1, %10 ], [ %73, %69 ]
%77 = phi i32 [ %0, %10 ], [ %17, %69 ]
br label %81
78: ; preds = %81, %69
%79 = phi i32 [ %73, %69 ], [ %84, %81 ]
%80 = icmp sgt i32 %1, 1
br i1 %80, label %87, label %93
81: ; preds = %75, %81
%82 = phi i32 [ %84, %81 ], [ %76, %75 ]
%83 = phi i32 [ %85, %81 ], [ %77, %75 ]
%84 = mul nsw i32 %82, %83
%85 = add nsw i32 %83, -1
%86 = icmp sgt i32 %85, %8
br i1 %86, label %81, label %78
87: ; preds = %78, %87
%88 = phi i32 [ %90, %87 ], [ %79, %78 ]
%89 = phi i32 [ %91, %87 ], [ %1, %78 ]
%90 = sdiv i32 %88, %89
%91 = add nsw i32 %89, -1
%92 = icmp ugt i32 %89, 2
br i1 %92, label %87, label %93
93: ; preds = %87, %7, %78, %2
%94 = phi i32 [ 1, %2 ], [ %79, %78 ], [ 1, %7 ], [ %90, %87 ]
ret i32 %94
}